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 = 101<= 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 }
posted @ 2017-11-23 16:57  Beginner_llg  阅读(192)  评论(0编辑  收藏  举报