【AGC016B】Colorful Hats【结论题】

结论题,一直在猜结论。
分几种情况讨论。
m a x n maxn maxn为看到数量的最大值, m i n n minn minn为看到数量的最小值。
1. m a x n − m i n n > 1 1.maxn-minn>1 1.maxnminn>1 直接输出No。
2. m a x n = = m i n n 2.maxn==minn 2.maxn==minn
( 1 ) m i n n = = n − 1 (1)minn==n-1 (1)minn==n1输出Yes
( 2 ) m i n n > n − 1 (2)minn>n-1 (2)minn>n1输出No
( 3 ) m i n n ∗ 2 ≤ n (3)minn*2\le n (3)minn2n输出Yes
( 4 ) (4) (4)否则输出No
因为不可能同时有若干个人在同一组,一些人单独一组,否则 m a x n ≠ m i n n maxn\ne minn maxn=minn
所以必须满足每个组至少两个人。所以 m i n n ∗ 2 ≤ n minn*2\le n minn2n
3. m a x n = = m i n n + 1 3.maxn==minn+1 3.maxn==minn+1
设有 t o t tot tot个人为 m i n n minn minn。则这些人单独一组。可以算出总组数为 s = m i n n − t o t + 1 s=minn-tot+1 s=minntot+1
( 1 ) s < 1 (1)s<1 (1)s<1输出No
( 2 ) s ∗ 2 ≤ n − t o t (2)s*2\le n-tot (2)s2ntot输出Yes。原因见上文。
( 3 ) (3) (3)否则输出No。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=100005;
int n,tot,s,a[N];
set<int> st;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		st.insert(a[i]);
	}
	sort(a+1,a+n+1);
	if(st.size()>2||a[n]-a[1]>1){
		puts("No");
		return 0;
	}else if(a[n]-a[1]==0){
		if(a[n]==n-1){
			puts("Yes");
		}else if(a[n]>n-1){
			puts("No");
		}else if(a[n]*2<=n){
			puts("Yes");
		}else{
			puts("No");
		}
		return 0;
	}
	for(int i=1;i<=n;i++){
		if(a[i]==a[1]){
			tot++;
		}
	}
	s=a[1]-tot+1;
	if(s<1){
		puts("No");
	}else if(s*2<=n-tot){
		puts("Yes");
	}else{
		puts("No");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值