hdu 2094

产生冠军

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9592    Accepted Submission(s): 4495

Problem Description

有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
球赛的规则如下:
如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。
如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。
根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。

Input

输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果n为0,则表示输入结束。

Output

对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。

Sample Input

3
Alice Bob
Smith John
Alice Smith
5
a c
c d
d e
b e
a d
0

Sample Output

Yes
No

Author

qianneng

Source

迎接新学期——超级Easy版热身赛

#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
set<string> win,los;
int n;
int main()
{
      set<string>::iterator it;
      string a,b;
      while(scanf("%d",&n)!=EOF)
      {
            if(n==0) break;
            win.clear(),los.clear();
            for(int i=0;i<n;i++)
            {
                  cin>>a>>b;
                  win.insert(a);
                  los.insert(b);
            }
            for(it=los.begin();it!=los.end();it++)
                  if(win.count(*it))
                        win.erase(*it);
            if(win.size()==1)
                  printf("Yes\n");
            else
                  printf("No\n");
      }
      return 0;
}

  

时间: 2025-01-12 13:33:11

hdu 2094的相关文章

HDU 2094 产生冠军 (字典树+拓扑)

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8591    Accepted Submission(s): 4047 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打

题解报告:hdu 2094 产生冠军

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2094 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C. 如果A打败了B,B又打败了C,而且,C又打败了A,那么A.B.C三者都不可能成为冠军. 根据这个规则,无需循环较量,或许就能确定冠军.你的任务就是面对一群比赛选手,在经过了若干场撕杀

HDU 2094 产生冠军 hash 水题

Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛.球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C.如果A打败了B,B又打败了C,而且,C又打败了A,那么A.B.C三者都不可能成为冠军.根据这个规则,无需循环较量,或许就能确定冠军.你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军. Input 输入含有一些选手群,每群选手都以一个整数n(n<1000)开头

hdu 2094 产生冠军

题意:给出n对选手姓名,每对表示前者赢后者,求整场比赛是否有冠军: 思路:将名字用数字表示,离散化,然后就是裸裸的拓扑排序,只需判断初始时入度为0的是否唯一: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,i,j,k,con; int mm[1001][1001],indegree[500010]; char s1[500010],s2[500010

HDU 2094 拓扑排序

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12031    Accepted Submission(s): 5583 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能

HDU 2094产生冠军(拓扑排序)

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10374    Accepted Submission(s): 4857 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能

HDU 2094解题报告

刚学完set,准备做个简单题目实践一下.结果半天都WA. 下面指出WA原因. 方法是这样的,把所有输的赢的都插入a1,输的插入a2: 那么如果最后name1-name2=1,则说明只有他没输过,能判断出冠军就是剩下的那个人. 1 #include<iostream> 2 #include<set> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 int n; 8 set<string>

拓扑排序简单题

产生冠军 题目传送:HDU - 2094 - 产生冠军 思路:因为只要确定是否产生冠军,根据题意可以得知当且仅当入度为0的只有一个时可以产生冠军,可以用map来映射存储的人的名字 AC代码: #include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #

HDU2094(产生冠军)题解

HDU2094(产生冠军)题解 以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 根据给定现有比赛结果推断分析冠军.(这描述...我建议还是看题吧,题不长) [题目分析] 给出的数据是每两个选手之间的关♂系,于是以为是简单链表,后来感觉是并查集,再后来才发现都不科学.于是换了一个特别科学普通简单粗暴可爱的方法.在说方法之前,我想吐槽几句.这道题似乎不够严谨.数据里如果有一组是a>b;b>c;c>a;d>e的话,这将分为两个不相关的组合.这种情况我感觉应该输出的