1 条题解
-
2
【题目大意】选出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
信息
- ID
- 576
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 203
- 已通过
- 32
- 上传者