【位运算】个人练习-Leetcode-2897. Apply Operations on Array to Maximize Sum of Squares

题目链接:https://leetcode.cn/problems/apply-operations-on-array-to-maximize-sum-of-squares/description/

题目大意:给定一个数组nums[],给出一种操作,该操作选定两个不同的数组元素x, y,然后将其中一个变为x AND y,另一个变为x OR y(二进制操作)。给定一个k,要求在进行任意次操作后,从数组中选k个元素的平方和最大。

思路:观察这个操作,其实就是把二进制x1和二进制y中的0互换(仅当同位置上一个为0一个为1时,因为ANDOR操作都不改变都为0和都为1的情况)。其实可以发现,这样下来,【每个位上面的总的0和总的1数量都不变】。

于是我们就统计一下每个位上面的总的0和总的1数量,开个30长度的数组就行,因为最大的 1 0 9 < 2 30 10^9<2^{30} 109<230

        int cnt[30] = {};
        for (auto x: nums) {
            for (int i = 0; i < 30; i++) {
                cnt[i] += (x >> i) & 1;
            }
        }

要使结果尽可能大,就要把1集中在选的k个数上,那么贪心即可,选k个数,每个数都尽量把剩下的每个位上的1都取走就行。

        long long ans = 0;
        while (k--) {
            int x = 0;
            for (int i = 0; i < 30; i++) {
                if (cnt[i]) {
                    cnt[i]--;
                    x |= 1 << i;
                }
            }
            ans = (ans + (long long)(x * x)) % MAX;
        }
        return ans;

思路倒是不太难的,只不过具体怎么位运算有点忘了,还是看了下题解…

完整代码

class Solution {
public:
    int maxSum(vector<int>& nums, int k) {
        const int MAX = 1000000007;
        int cnt[30] = {};
        for (auto x: nums) {
            for (int i = 0; i < 30; i++) {
                cnt[i] += (x >> i) & 1;
            }
        }
        long long ans = 0;
        while (k--) {
            int x = 0;
            for (int i = 0; i < 30; i++) {
                if (cnt[i]) {
                    cnt[i]--;
                    x |= 1 << i;
                }
            }
            ans = (ans + (long long)(x * x)) % MAX;
        }
        return ans;
    }
};

相关推荐

  1. 个人笔记>运算

    2024-06-12 10:56:02       19 阅读
  2. LeetCode 75| 运算

    2024-06-12 10:56:02       40 阅读
  3. leetcode算法-运算

    2024-06-12 10:56:02       30 阅读
  4. 运算Leetcode371.两整数之和

    2024-06-12 10:56:02       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 10:56:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 10:56:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 10:56:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 10:56:02       20 阅读

热门阅读

  1. 切换到root用户的方法和区别

    2024-06-12 10:56:02       9 阅读
  2. Git最全管理详解

    2024-06-12 10:56:02       8 阅读
  3. STM32 UART 错误代码 HAL_UART_ERROR_PE

    2024-06-12 10:56:02       8 阅读
  4. 实现EM算法的主循环

    2024-06-12 10:56:02       8 阅读
  5. go语言接口之http.Handler接口

    2024-06-12 10:56:02       9 阅读
  6. 富格林:活用经验可信提高出金

    2024-06-12 10:56:02       7 阅读
  7. 力扣1146.快照数组

    2024-06-12 10:56:02       11 阅读
  8. C++中的享元模式

    2024-06-12 10:56:02       9 阅读
  9. Ubuntu系统介绍

    2024-06-12 10:56:02       7 阅读
  10. $(this) 和 this 关键字在 jQuery 中有何不同?

    2024-06-12 10:56:02       7 阅读