社区讨论

不是,猎奇算法也能过?

P9509 『STA - R3』Aulvwc参与者 7已保存回复 11

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@lo1x0isq
此快照首次捕获于
2023/10/23 04:22
2 年前
此快照最后确认于
2023/11/03 04:49
2 年前
查看原帖
n10n \leq 10 时暴力,其余情况判断全局平均数是不是整数就可以了。
有大佬可以帮我证一下 nn 大于 1010 时为什么这个判断可以吗。
CPP
#include <bits/stdc++.h>

using namespace std;
const int m=5005;
int n;
int a[10005];
int avg[150005],vis[10005],k[10005],cnt[10005],vis_k[50005];
inline int read(){
	int f=1,x=0;char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
	while('0'<=s&&s<='9'){x=(x<<1)+(x<<3)+s-48;s=getchar();}
	return x*f;
}
inline bool check() {
    int sum = 0;
    for (int i = 1; i <= n; i++)  sum += a[i];
    if (sum % n != 0) return false;
    return true;
}
bool fl;
void dfs(int step){
	if(step==n+1){
		for(int i=1;i<=n;i++) k[i]=0,cnt[i]=0;
		for(int i=0;i<=5005+m;i++) vis_k[i]=0;
		for(int i=1;i<=n;i++){
			k[vis[i]]+=a[i];
			cnt[vis[i]]++;
		}int op=0;
		for(int i=1;i<=n;i++){
			if(cnt[i]) op++;
		}
		if(op<=1) return;
		for(int i=1;i<=n;i++){
			if(cnt[i]==0) continue;
			if(k[i]%cnt[i]!=0) return;
			vis_k[k[i]/cnt[i]+m]=1;
		}int k=0;
//		cout << 1 << "\n";
		for(int i=0;i<=5005+m;i++){
			k+=vis_k[i];
		}
		if(k<2){
			fl=1;
			printf("Yes\n");
		}
		return;
	}
	
	for(int i=1;i<=3;i++){
		vis[step]=i;
		dfs(step+1);
		if(fl) return;
	}
}int q;
int main() {
    
    q=read();
    for (int i = 0; i < q; i++) {
        n=read();
        for (int j = 1; j <= n; j++) {
            a[j]=read();
        }
        if(n<=10){
        	fl=0;
        	for(int i=1;i<=n;i++) vis[i]=0;
        	dfs(1);
        	if(!fl) printf("No\n");
		}else{
			if (check()) {
	            printf("Yes\n");
	        } else {
	            printf("No\n");
	        }
		}
        
    }

    return 0;
}
辛苦大佬了。

回复

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

正在加载回复...