2017/11/22模拟赛
水(water)
【问题描述】
T1 还是出水一点吧, 希望大家都能 AC。
闲人村里有 n 个人闲着没事干, 他们各自从家里拿了一顶帽子戴
上出来聚会。 聚会结束后, 作为村里的眼科大夫, 你去每个人家里家
访, 第i 个人告诉你他看见其他人戴的帽子的颜色一共有 ai 种。 你想
知道这些人里是不是已经有人眼睛不好使了, 但你没有去聚会所以不
知道每个人帽子的颜色, 你需要判断是否存在一种合法的戴帽方案使
得所有人给出的信息都合法。
【输入格式】
多组数据, 第一行一个正整数T 表示数据组数。
每组数据第一行一个正整数 n , 第二行 n 个正整数 ai 。
【输出格式】
每组数据输出一行“Yes” 或“No” 表示答案。
【样例输入】
2 3 1
2 2
3 1
1 2
【样例输出】
Yes
No
【数据范围】
对于 20%的数据, 1<= n <= 5;
对于另外 40%的数据, T = 1;
对于 100%的数据, T = 10, 1<= ai <= n <= 10^5。
题解:分3种情况:
①信息>=3种:必定不合法。
②信息只有1种:若2种信息相差大于1,不合法;最多情况下,每2个为同色,答案小等于n/2即可;或全部不同色,则答案为n-1。
③信息有2种:则较小的必定为单个颜色,较大的必定同种颜色数大等于2,判断见程序。
代码如下:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 freopen("water.in","r",stdin); 7 freopen("water.out","w",stdout); 8 int T; scanf("%d",&T); 9 while(T--){ 10 int n,n1=0,n2=0,ct1=0,ct2=0; 11 bool ok=false; 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++){ 14 int a; scanf("%d",&a); 15 if(a==n1) ct1++; 16 else if(a==n2) ct2++; 17 else if(!n1) n1=a,ct1++; 18 else if(!n2) n2=a,ct2++; 19 else ok=true; 20 } 21 if(ok){puts("No");continue;} 22 if(n1>n2&&n2!=0) swap(ct1,ct2),swap(n1,n2); 23 if(n2-n1>1){puts("No");continue;} 24 if(!n2){ 25 if(n1<=n/2){puts("Yes");continue;} 26 if(n1==n-1){puts("Yes");continue;} 27 puts("No"); 28 } 29 else{ 30 if(ct2==1){puts("No");continue;} 31 if(n2>ct1&&n2<=ct1+ct2/2){puts("Yes");continue;} 32 puts("No"); 33 } 34 }return 0; 35 }