社区讨论

求助!P6747

灌水区参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lqoqw251
此快照首次捕获于
2023/12/28 13:09
2 年前
此快照最后确认于
2023/12/28 17:08
2 年前
查看原帖
CPP
#include<bits/stdc++.h> 
using namespace std;
int main(){
	long long n,a[114514],b[114514],q;
	long long c=0,two[114];
	two[0]=1;
	for(int i=1;i<=60;i++){
		two[i]=two[i-1]*2;
	}
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
		c=a[i]+c;
	}
	long long  dsb[114],l=0;
	for(int i=1;i<=n;i++){
		int j=0;
		while(b[i]){
			if(b[i]%2){
				dsb[j]++;
			}
			b[i]=b[i]/2;
			j++;
		}
	}
	for(int i=30;i>0;i--){
		if(dsb[i]){
			l=i;
			break;
		}
	} 
	cin>>q;
	while(q){
		long long m,k[114],add=c;
		cin>>m;
		//cout<<c<<"<>";
		for(int i=60;i>=0;i--){
			if(add+two[i]*(n-2*dsb[i])<=m){
				k[i]=1;
				//cout<<"I";
				add=add+two[i]*(n-2*dsb[i]);
			}else{
				k[i]=0;
				//cout<<"O";
			}
			//cout<<"add="<<add<<"dbs="<<two[i]<<endl;
		}
		long long k1=0;
		for(int i=60;i>=0;i--){
			k1=k1*2;
			k1=k1+k[i];
		}
		if(k1==0&&c>m) cout<<-1<<endl;
		else cout<<k1<<endl;
		q--;
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...