hdu 2094 产生冠军
题解:
题中有两群人,前面的一群人看成是冠军候选人,后面的一群人看成不可能成为冠军的人,如果冠军候选人同时出现在另一个群里,则将该冠军候选人踢出冠军候选人群。最后冠军候选人群中如果仅剩下一人,则这个人就是冠军,否则没有冠军。
代码如下:
#include <stdio.h> #include <string.h> typedef struct Player { char win[20], lose[20];//最好写成20,第一次写10的时候没有通过 }player; int main() { int n, i, j, ok; char tmp[20]; player ply[1000]; 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);//更换候选冠军 } } ok == 1 ? printf("Yes\n") : printf("No\n"); } return 0; }