蒟蒻10分求助,心态炸了
查看原帖
蒟蒻10分求助,心态炸了
340632
Cry_For_theMoon楼主2020/8/18 20:24

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;
} 
2020/8/18 20:24
加载中...