1 条题解

  • 0
    @ 2025-9-20 23:56:03

    假如当前位上存在两个元素可以 & 运算获得 1,我们可以将所有取值为 1 的元素保留下来,而取值为 0 的元素无论怎么运算都是 0,直接删除;假如当前位任何元素 & 运算都不能得到 0,我们就忽略这位,继续观察下一位。直到剩下两个元素,那么这两个元素 & 运算肯定是最大的。

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    vector<vector<int>> readGroups(int groups)
    {
        vector<vector<int>> result;
    
        while (groups--)
        {
            int n;
            cin >> n;
    
            vector<int> group(n);
            for (int i = 0; i < n; ++i)
            {
                cin >> group[i];
            }
    
            result.push_back(group);
        }
    
        return result;
    }
    
    int testhardness(vector<int> group)
    {
        int highest_hardness = 0;
        int length = group.size();
    
        for (int i = 0; i < length; ++i)
        {
            for (int j = 0; j < length; ++j)
            {
                if (i != j)
                {
                    int hardness = group[i] & group[j]; // 计算两个数字的按位与
                    if (hardness > highest_hardness)
                    {
                        highest_hardness = hardness;
                    }
                }
            }
        }
    
        return highest_hardness;
    }
    
    
    unsigned Max(vector<int> array){
        int len = array.size();
        int maxBit = sizeof(unsigned) * 8; // 最高位数
        unsigned currBit = 1; // 当前位
        int mark[len]; // 标记被剔除元素的数组,下标对应相应的元素
        int result = 0;
        for (int i = 0; i < len; i++) mark[i] = 1; // 第i个元素为1,表示保留
        currBit = currBit << (maxBit-1);
        for (int i = 0; i < maxBit; i++){
            // 统计
            int count = 0;
            for(int j = 0; j < len; j++){
                if(mark[j] == 1 && (array[j] & currBit) != 0) 
                	count++;
            }
            
            if (count > 1){
                // 剔除
                for(int j = 0; j < len; j++){
                    if ((array[j] & currBit) == 0)
                        mark[j]=0;  // 标记数组置为0表示剔除
                }
                // 更新结果,如 0100 + 0010 = 0110
                result += currBit;
            }
            // 下一位
            currBit = currBit >> 1;
        }
        
        return result;
    }
    
    int main()
    {
        int groups;
        cin >> groups;//总组数
        auto data = readGroups(groups);
    
        int i = 1;
        for (const auto &group : data)
        {
            cout << "Case #" << i << ": " << Max(group) << endl;
            i++;
        };
    
        return 0;
    }
    
    
    • 1

    信息

    ID
    296
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    29
    已通过
    5
    上传者