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; }
相关文章推荐
- HDU 2094 产生冠军 (不重复集合set)
- hdu 2094 产生冠军(set)
- HDU 2094 产生冠军(STL 集合set)
- hdu 2094 产生冠军【set基础应用】
- hdu 2094 产生冠军(STL,set)
- HDU 2094 产生冠军 (STL:set用法)
- hdu 2094 产生冠军
- [HDU] 2094 产生冠军(拓扑排序+map)
- hdu 2094 产生冠军
- hdu 2094 产生冠军
- HDOJ 产生冠军 2094(set)
- hdu-2094 产生冠军
- HDU 2094 产生冠军
- 产生冠军 2094(map和set的结合使用)
- HDU 2094 产生冠军
- hdu 2094 产生冠军
- HDU 2094产生冠军(拓扑排序)
- HDU 2094 产生冠军
- hdu 2094 产生冠军
- Hdu 2094 产生冠军 程序参考