分析
题目要求我们求出至少 个数全部 之后的最大值。我们考虑到 。所以我们其实求出恰好 个就好了。对于第 位要为一,那么这 个数这一位也必须全部为 。如果可以在这一位找到 个数,那么,保留除了这一位为 的,然后继续考虑下一位。否则直接考虑下一位。这样的答案是不劣的,那么总的复杂度为 。
代码
#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; }