题目大意
这个题目简化一下就是求 \(n\) 个数中取 \(k\) 个数按位与的最大值
思路
很容易想到贪心。
题中说道输入的数在二进制下最多 \(29\) 位,所以我们从 \(29\) 开始遍历二进制位,如果当前位有大于等于 \(k\) 个 \(1\),那么标记一下这些数,可以发现剩下的比当前位低的二进制位和无法大于当前位,所以必选当前位。最后再遍历时只需要考虑这些打过标记的数即可。
另外我们还需要知道如何取出整数 \(n\) 在二进制下的第 \(k\) 位:
\[(n>>k)\&1 \]代码
#include<bits/stdc++.h>
#define MAX 200005
#define int long long
using namespace std;
int n,k,a[MAX],cnt,ans,tmp;
bool pd[MAX];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
memset(pd,1,sizeof(pd));
for(int i=29;i>=0;i--){
cnt=0;
for(int j=1;j<=n;j++){
tmp=(a[j]>>i)&1;
if(pd[j]&&tmp)cnt++;
}
if(cnt>=k){
for(int j=1;j<=n;j++){
tmp=(a[j]>>i)&1;
if(pd[j]&&!tmp)pd[j]=0;
}
ans+=(1<<i);
}
}
cout<<ans<<'\n';
return 0;
}
标签:tmp,cnt,int,题解,29,Hindenburg,P9612,pd,MAX
From: https://www.cnblogs.com/MithrilSwordXIV/p/18003407