Description
在一次聚会上,有一些男孩女孩,现在我们问每一个人他/她看到的女生数量(除自己外),根据这些数量求出在场的女生数,如果不存在合理情况则输出Impossible
Input
第一行为一整数T表示用例组数,每组用例第一行为一整数n表示在场人数,第二行为n个整数表示每个人看到的女生数量
Output
对于每组用例,输出在场女生数量,如果不存在合理情况则输出Impossible
Sample Input
1
3
2 1 1
Sample Output
2
Solution
统计每个女生数量出现的次数flag以及有多少个不同的女生数量cnt并记录女生数量最小值min;如果cnt>2显然不成立,如果cnt=1说明在场要么全是男生要么全是女生,此时需要判断min是否为0,如果min为0说明全是男生输出0,否则判断flag[min+1]是否为n,等于n则说明全是女生输出n,否则不成立;当cnt=2时需判断flag[min]+flag[min+1]是否等于n,不等于n则不成立,等于n时再判断flag[min]是否等于min+1,等于说明女生数量为min+1输出即可,否则不成立,注意n=1时一定不成立,因为不知道这个人到底是男是女
Code
#include<stdio.h>
#include<string.h>
#define maxn 11111
int t,n,flag[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
memset(flag,0,sizeof(flag));///初始化
scanf("%d",&n);
int cnt=0,min=1<<30,d;
for(int i=0;i<n;i++)
{
scanf("%d",&d);
if(!flag[d])
{
min=min>d?d:min;//更新女生数量最小值
cnt++;//统计有多少不同的女生数量
}
flag[d]++;//统计每个女生数量出现的次数
}
if(cnt>2||n==1)//出现两个以女生数量或者只有一个人时显然不成立
printf("Impossible!\n");
else if(cnt==1)//全男或者全女
{
if(min==0) printf("0\n");//全男
else if(min+1==n) printf("%d\n",n);//全女
else printf("Impossible!\n");//不成立
}
else if(cnt==2)//部分男部分女
{
if(flag[min]+flag[min+1]==n)//min和min+1这两种数量出现的次数和应为n
{
if(flag[min]==min+1)printf("%d\n",min+1);//女生应该比男生看到的女生数量少一
else printf("Impossible!\n");//不成立
}
else printf("Impossible!\n");//不成立
}
}
return 0;
}