题目链接:https://www.codechef.com/problems/TAAND
题意:给你一个数组,让你找出任意有序对按位与的最大值
思路:其实最终要找的就是两个数,它们的相同位的值最大,所以我们从二进制位大到小考虑,(数据最大10^9)大概31 30位的样子开始计算,找到在高位有1的数 放入新的集合,如果大于等于2 接下来我们就考虑它们就好了,如果小于2,说明我们的答案不可能有这一位,继续迭代原集合,但是考虑低一位。 所以最大复杂度就是(32 *3* 10^)
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
int main() {
int n;
scanf("%d", &n);
bitset<33> b;
vector<int> v, v2;
for (int i = 0; i < n; i++) {
int t;
scanf("%d", &t);
v.push_back(t);
}
for (int i = 30; i >= 0; i--) {
int r = v.size();
for (int j = 0; j < r; j++) {
b = v[j];
if (b[i]) {
v2.push_back(v[j]);
}
}
if (v2.size() >= 2) {
v = v2;
}
v2.clear();
}
printf("%d\n", v[0] & v[1]);
return 0;
}