题意:
给你一个长度为n的数组和k,确定一个在 [ 0 , k ] 之间的数 x 使得它与数组的异或和最大。
思路:
处理出每一位 1 的个数。单独的看每一位,要想让异或和其尽可能地大,对于x的每一位,1多的就要放0,0多的就要放1。总体看要想使其大,我们要想办法尽可能的使高位满足条件。放0不影响x的大小,那对于每一次放1就要看是否小于k。所以从高位向低位贪心的搞就行了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10,inf=1e12;
int n,k;
int a[N];
int num[45];
signed main(){
cin >> n >> k;
int cnt=0;
for(int i=0;i<n;i++){
cin >> a[i];
int x=a[i];
cnt=0;
while(x){
num[cnt++]+=x&1;
x >>= 1;
}
}
int res=pow(2,40);
int ans=0,sum=0;
for(int i=40;i>=0;i--,res >>= 1){
int num1=num[i],num0=n-num1;
if(num1>=num0) ans+=num1*res; //放0
else{
if(res+sum<=k){
sum+=res;
ans+=res*num0; //放1
}
else{
ans+=res*num1; //放0
}
}
}
cout << ans << endl;
return 0;
}