您的位置:首页 > 其它

hdu 2094 产生冠军 (set)

2015-04-18 13:50 274 查看

题意:给n组关系,每组有两个对象,代表前一个对象战胜后一个对象,问是否存在冠军。

思路:冠军一定是赢得了除自己以外的所有的人(实力最强),跟冠军直接PK的人一定是输的,没有跟冠军PK过的人一定是输给曾输给冠军的人
集合A保存所有参赛的人,集合B保存有失败记录的人,C=A-B代表全胜的人的集合,如果集合C为空集,那么代表不存在全胜的人,如果集合C的元素个数为1,那么代表:
可能1.该人赢了所有的人,显然冠军是该全胜的人
可能2.该人赢了一部分人,而另一部分的又输给曾输给该人的人。显然冠军是该全胜的人。
可能3.该人赢了一部分人(用集合X代表),而另一部分的人(用Y代表)互相输,但就是没输给集合X,虽然这时候并不能保证该人的实力最强,但根据题意(如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军),集合Y里的人都不可能是冠军,再加上X里的人又输给该人,所以冠军只能是该全胜的人
如果集合C的元素个数为2或更多,那么显然难判断谁是冠军。

代码:
#include<cstdio>
#include<set>
#include<string>
using namespace std;

int main()
{
    set<string> A,B;
    int n;
    char s1[20],s2[20];
    while(scanf("%d",&n),n)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%s%s",s1,s2);
            A.insert(s1);
            A.insert(s2);
            B.insert(s2);
        }
        if(A.size()-B.size()==1)
            printf("Yes\n");
        else
            printf("No\n");
        A.clear();
        B.clear();
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: