[AGC016B] Colorful Hats (结论)

Description

有n个人,每个人都戴着一顶帽子。当然,帽子有不同的颜色。

现在,每个人都告诉你,他看到的所有其他人的帽子共有多少种颜色,请问你有没有符合所有人的描述的情况。

Input

第一行一个整数n。

第二行n个整数,第i个数ai表示第i个人看到的所有其他人帽子颜色的种数。

Output

若存在一种情况满足条件,输出"Yes",否则输出"No"。(均不含引号)

题解:

看起来就像是(玄学)结论题……

首先很明显的是,最大值和最小值的差不能大于1。

那我们先考虑最大值等于最小值的情况,首先全部都是1或者n-1都是合法的。

那其他的,每种颜色至少要有两顶或以上的帽子(任取一种可以看到的为另外几个和自己一样的和其他不同的)

那只要 \({n \over 颜色数}\geq 2\),即为合法。

那如果最大值不等于最小值,那么小的的那些帽子的颜色肯定都是独一无二的。

大的颜色肯定每种颜色的帽子都至少要有两顶。

那么把小的颜色总数减去,剩下的颜色填到剩下的空位去,看看能不能使剩下的颜色每种都有至少两个。

CODE:

#include<iostream>
#include<cstdio>
using namespace std;

int n,x,cnt=0;
int minv=1e9,maxv=-1e9;

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		if(x==minv)cnt++;
		if(x<minv)minv=x,cnt=1;
		if(x>maxv)maxv=x;
	}
	if(maxv-minv>1)return printf("No"),0;
	if(maxv==minv){
		if(minv==n-1)return printf("Yes"),0;
		return printf(n/minv>=2?"Yes":"No"),0;
	}
	int a=n-cnt,b=maxv-cnt;
	if(b<1)return printf("No"),0;
	return printf(a/b>=2?"Yes":"No"),0;
}
posted @ 2018-08-20 20:19  ezoiLZH  阅读(271)  评论(0编辑  收藏  举报