题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2094
/**************************************************************
此题要产生冠军的意思就是,最后只有一个人从来没输过。
如果两个人没输过,也算没产生冠军。
所以,我们只需要统计有几个人输过。
/************************************************************
代码思路:n场比赛,那么一共输入2*n个名字,未出现过的名字加入到二维数组name中,sum统计总人数,loser表示输的人数
首先用数组vis把所有人记录为胜者。一旦某个人输了,就把对应的vis[j]赋值为0(败者)。
/*****************************************************************
代码如下:
/*************
#include<stdio.h>
#include<string.h>
char name[1001][100];//选手的名字
int main()
{
char p[100];
int vis[1001];
int n,sum,loser;
int flag;
while(scanf("%d",&n),n>0)
{
for(int i=0;i<1001;i++)
vis[i]=1; //假设所有人都是胜者
loser=0; //失败者人数初始为0
sum=0; //参赛人数初始为0
for(int i=0;i<n*2;i++)
{
scanf("%s",p);
flag=0;
for(int j=0;j<sum;j++)
{
if(strcmp(p,name[j])==0)
{
if(i%2&&vis[j]==1)//败方
{
loser++;
vis[j]=0;//败了标记为0
}
flag=1;
}
}
if(!flag)//新加入的一名比赛者
{
strcpy(name[sum],p);
if(i%2)//败方(第偶数次输入的)(i是从0开始的)
{
loser++;
vis[sum]=0;
}
sum++;
}
}
if(sum-loser==1)//只有一位冠军
{
puts("Yes");
}
else
{
puts("No");
}
}
return 0;
}