分析
题目要求我们求出至少 个数全部
之后的最大值。我们考虑到
。所以我们其实求出恰好
个就好了。对于第
位要为一,那么这
个数这一位也必须全部为
。如果可以在这一位找到
个数,那么,保留除了这一位为
的,然后继续考虑下一位。否则直接考虑下一位。这样的答案是不劣的,那么总的复杂度为
。
代码
#include<bits/stdc++.h>
using namespace std;
vector<int> A,B;
int n,k;
int main() {
scanf("%d%d",&n,&k);
for(int i = 1,x;i <= n;i++) scanf("%d",&x),A.push_back(x);
for(int i = 30;~i;i--) {
for(auto x:A) if((x>>i)&1) B.push_back(x);
if(B.size() >= k) swap(A,B);B.clear();
}
int ans = (1<<30)-1;
for(auto x:A)ans &= x;
cout << ans << endl;
}
京公网安备 11010502036488号