HDU 2094 产生冠军
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2094
思路一:产生冠军的条件:(1)获胜的人没输过一次(2)最终获胜的人只有一个
思路二:观察一下,可以看到其实只要总元素数-失败者==1就可以输出YES了。。
思路三:左边的为胜利者,右边的为失败者,如果左边的胜利者只有一个没在右边出现过,那么这个就是产生的冠军,否则产生不了
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int main() 5 { 6 int n,i,j,k; 7 int sum[1010],c[1010]; //记录是否获胜 8 char a[1010][100],b[1010][100]; //记录每队选手的名字 9 while(scanf("%d%*c",&n),n) 10 { 11 memset(sum,0,sizeof(sum)); //初始化使sum=0,表失败 12 for(i=0;i<n;i++) 13 { 14 scanf("%s%s",&a[i],&b[i]); 15 sum[i]=1; //表示前面a[i]获胜,b[i]失败 16 } 17 for(i=0;i<n;i++) //比较看在b[i]中是否存在与a[i]相同的,存在就不是胜利者 18 { 19 for(j=0;j<n;j++) 20 { 21 if(strcmp(a[i],b[j])==0) 22 sum[i]=0; 23 } 24 } 25 for(k=0,i=0;i<n;i++) //将全部没出现在失败者里的获胜者 的编号存放在c[]数组里,然后再比较 26 { 27 if(sum[i]==1) 28 c[k++]=i; 29 } 30 int flag=0; 31 for(i=1;i<k;i++) 32 { 33 if(strcmp(a[c[i]],a[c[i-1]])==0) 34 flag++; //比较看是否只有一个人在真的获胜者之中 35 } 36 if(flag==k-1) printf("Yes\n"); 37 else printf("No\n"); 38 } 39 system("pause"); 40 return 0; 41 } 42 43 44