1 条题解

  • 2
    @ 2024-6-13 1:04:39

    【题目大意】选出2个数字,求出这2个数字与操作的最大结果是多少。

    【考纲知识点】位运算知识,循环知识,排序知识

    【解题思路】需要选取2个数字,可以用双重循环枚举这2个数字,取最大值,最终得到答案。对于前40%的测试点是可以的。当数据量大的时候,就超时了。

    我们知道,两个数字对应的二进制,位数越高是1,越有可能是答案。所以从最高位统计,是否至少有2个数字最高位是1,保存最高位结果,并且把最高位非1的数字删去;再查询次高位是否至少有2个以上的数字二进制位都是1,以此类推,求出哪2个数字与结果最大。利用快速排序的方法每次将剩余数字中当前考虑的位为1的数字放在前面,时间复杂度是O(N*log(a_i值的最大值))。

    【参考程序】

    #include <bits/stdc++.h>
    using namespace std;
    int a[1000100];
    int sort(int l, int r, int k)
    {
        while (l <= r)
        {
            while ((l <= r) && (a[l] >> k & 1))
                l++;
            while ((l <= r) && (!(a[r] >> k & 1)))
                r--;
            if (l <= r)
                swap(a[l++], a[r--]);
        }
        return r;
    }
    int main()
    {
        int n, j, ans = 0;
        cin >> n;
        for (int i = 1; i < n; i++)
        {
            cin >> a[i];
        }
        for (int i = 31; i >= 0; i--)
        {
            if ((j = sort(1, n, i)) >= 2)
            {
                ans = ans | 1 << i;
                n = j;
            }
        }
    
        cout << ans;
        return 0;
    }
    
    • 1

    [GESP202312 五级] 烹饪问题

    信息

    ID
    576
    时间
    1000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    180
    已通过
    25
    上传者