分析

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

代码

#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;
}