rt
跟题解一样用的按位贪心。但是除了#1其它的都一直WA
蒟蒻求助各位dalao,谢谢了QwQ
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=1e5+10;
long long a[MAXN],choose[100]; //有几个1
long long minchoose;
int n,q;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
long long tmp=a[i];
for(int i=1;i<=55;i++){
choose[i]+=(bool)(tmp & 1LL<<(i-1)); //预处理出每一位有几个1
}
}
//预处理出最小值
for(int i=1;i<=55;i++){
minchoose+=min(choose[i],n-choose[i])*(1LL<<(i-1));
}
cin>>q;
for(int i=1;i<=q;i++){
long long m;
cin>>m;
if(minchoose>m){
printf("-1\n");continue;
}
long long ans=0,s=0;
for(int i=55;i>=1;i--){
//能选1就选1
if(s+(n-choose[i])*(1LL<<(i-1)) <= m){
s=s+(n-choose[i])*(1LL<<(i-1));
ans=ans+(1LL<<(i-1));
}else{
s=s+(choose[i])*(1LL<<(i-1));
}
}
cout<<ans<<endl;
}
return 0;
}