救命
查看原帖
救命
347832
tony_wind楼主2023/8/10 09:46

不知道哪里写错了

#include<bits/stdc++.h>

using namespace std;

int a[1005];
int v1[500005],v2[500005];
int q,n;

int main(){
	cin>>q;
	
	while(q--){
		memset(v1,0,sizeof(v1));
		memset(v2,0,sizeof(v2));
		memset(a,0,sizeof(a));
		cin>>n;
		long long seg = 0;
		for(int i = 1;i<=n;i++){
			cin>>a[i];
			seg+=a[i];
		}
	//	cout<<seg<<' ';
		
		if(seg%n != 0){
			cout<<"No"<<endl;
			continue;
		}
		bool f = 0;
		
		for(int i = 1; i <= n; i++){
			
			if(a[i] == seg/n){
				f=1;break;
			}
			a[i]-=seg/n;
		}
		if(f || n > sqrt(n)){
			cout<<"Yes"<<endl;
			continue;
		}
		
		
		sort(a+1,a+1+n);
	
		
		int tot = 0;
		int i = 1;
		while(a[i]<0){
			tot += abs(a[i]);
			
			for(int j = seg; j >= 1; j--){
				if(v1[j]) v1[j+abs(a[i])]=1;
			}
			v1[abs(a[i])] = 1;
			i++;
		}
		
		while(i<=n){
			if(a[i] == 0){
				f = 1;
				break;
			} 
			
			
			for(int j = seg; j >= 1; j--){
				if(v2[j]) v2[j+a[i]]=1;
				if(v1[j] == 1 && v2[j] == 1 && j != tot){//cout<<j<<' ';
					f=1;
					break;
				}
			}
			v2[a[i]]=1;
			i++;
			if(f)break;
		}
		//for(int i = 1; i<= seg;i++)cout<<v1[i]<<' ';cout<<endl; 
		//for(int i = 1; i<= seg;i++)cout<<v2[i]<<' ';cout<<endl;
		if(f){
			cout<<"Yes"<<endl;
		}
		else cout<<"No"<<endl;
		
	}
	return 0;
}
2023/8/10 09:46
加载中...