今天题解开放,大家可以帮我看看了吧。
我和题解的想法几乎一样但我写得好看了很多,可是只有四十分。
看着我简洁美观码风优良的代码就帮我调调吧
#include <cstdio>
#include <iostream>
#define N 100005
using namespace std;
long long a[N], maxx, m, ans, n, q, LG_0[55], LG_1[55];
long long Doit(int d){
long long an = 0, ans = 0;
bool flag = 0;
for(int i = d; i >= 0; i--){
long long now = (long long) 1 << i;
if(an + now * LG_1[i] <= m){
an += now * LG_1[i];
ans += now;
}
else if(an + now * LG_0[i] <= m)
an += now * LG_0[i];
else return -1;
}
return ans;
}
int main(){
scanf("%lld", &n);
int maxx = 0;
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
for(int i = 0; i <= 51; i++)
for(int j = 1; j <= n; j++){
LG_0[i] += (a[j] >> i) & 1;
LG_1[i] += 1 - ((a[j] >> i) & 1);
}
scanf("%lld", &q);
for(int i = 1; i <= q; i++){
scanf("%lld", &m);
ans = Doit(51);
printf("%lld\n", ans);
}
return 0;
}