求助各位大佬,40分
我觉得应该不会是精度问题,本来开到60,10分;遵从大佬意见改成了40
#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<=40;i++){
choose[i]+=(bool)(tmp & 1LL<<(i-1)); //预处理出每一位有几个1
}
}
//预处理出最小值
for(int i=1;i<=40;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=40;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;
}