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;
}