hdu2094产生冠军

来源:互联网 发布:西安市旅游业数据 编辑:程序博客网 时间:2024/05/16 17:13

1.题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2094

 

2.思路:

       可以将左边的看成第一群人,将右边的看成第二群人,左边的就是候选人,右边的不是。题目要求找是否有冠军,有一个就输出Yes,否则就输出No,多个冠军就算没有冠军。

       这样,我们就可以在第一群人中找,如果第一群人中在第二群人中有出现,意思就是赢的人也有被打败的比赛,那么这个人就不可能是冠军,从第一群人中删除掉,如果在第二群人中找不到的,冠军人数就加一,最后统计冠军人数,如果大于1,就直接可以判定没有冠军。

      其实这题是关于拓扑排序的,但是我觉得这个思路很好,从别人那边看到的,值得一学。

 

3.参考代码:

 

#include <stdio.h>#include <string.h>struct player{char win[30],lose[30];};int main(){int i,j,n,ok;player ply[1000];char tmp[30];while(scanf("%d",&n) && n){for(i=0;i<n;i++)   ///输入信息scanf("%s %s",ply[i].win,ply[i].lose);for(i=0;i<n;i++)   ///从赢的名单中删除输的候选人,即输的候选人不可能成为冠军{for(j=0;j<n;j++){if(!strcmp(ply[i].win,ply[j].lose)){ply[i].win[0]='#';break;}}}ok=0;   ///冠军候选的人数tmp[0]='#';   ///候选冠军的名字for(i=0;i<n;i++){if(ply[i].win[0]!='#' && strcmp(ply[i].win,tmp)){   ///如果该冠军没有被删除,并且是冠军候选人ok++;   ///冠军人数加一if(ok>1)   ///当冠军人数大于1,就知道没有冠军了break;strcpy(tmp,ply[i].win);   ///更换候选冠军}}if(ok==1)printf("Yes\n");elseprintf("No\n");}return 0;}


 

 

 

 

原创粉丝点击