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;
}

 

posted on 2013-01-25 16:43  zm001  阅读(166)  评论(0编辑  收藏  举报