Description
有n只猫,每只猫有一个颜色。每只猫都会看一看除它以外有多少种颜色,记这个序列为a[]
现在给出n和a[],问是否存在一个颜色序列满足给出的限制
Solution
技不如人甘拜下风.jpg
很容易想到全部一样要咋做。全部一样的话要么颜色全部一样,要么每种颜色至少两个,这个判一下就可以了
假设一共有k种颜色的帽子。
一个独一无二的颜色会说k-1其余说k。
如果最大的ai减最小的ai大于1一定有假话。
然后考虑最大值不等于最小值的情况。
对于说k-1的当然都独一无二,剩余的颜色每种至少分配给两个人。
大力Orz题解
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
const int N=200005;
int a[N];
int read() {
int x=0,v=1; char ch=getchar();
for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());
for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());
return x*v;
}
int main(void) {
int n=read();
rep(i,1,n) a[i]=read();
std:: sort(a+1,a+n+1);
if (a[1]==a[n]) {
if (a[1]==n-1) return 0&puts("Yes");
if (a[1]*2<=n) return 0&puts("Yes");
return 0&puts("No");
} else if (a[1]+1==a[n]) {
int s=0;
rep(i,1,n) s+=(a[i]==a[1]);
if (a[1]<s||(a[n]-s)*2>n-s) puts("No");
else puts("Yes");
} else puts("No");
return 0;
}