HDU 2094 产生冠军 map
2015-08-10 16:34
323 查看
原题: http://acm.hdu.edu.cn/showproblem.php?pid=2094
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11673 Accepted Submission(s): 5426
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
我们每次先看赢家有没有被打败过,如果没参加过比赛,那么他可能是冠军,状态改成1,如果没有他的状态是1,表示他是冠军之一。如果他参加过比赛,那么他肯定是他之前的状态(之前不是冠军现在怎么打都不能当冠军,输了的记录不会被抹去,之前是冠军现在赢了依然可能是冠军,不做更新)。
对于输了的人,不管他之前状态,这局输了就注定和冠军无缘,状态为-1。
最后只需要扫描哪些人有冠军的能力,人数为1才是冠军。
题目:
产生冠军Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11673 Accepted Submission(s): 5426
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
思路:
只需要求最后有人没有被打败过,只有ans是1的时候才输出yes,代表只有一个人是冠军。我们每次先看赢家有没有被打败过,如果没参加过比赛,那么他可能是冠军,状态改成1,如果没有他的状态是1,表示他是冠军之一。如果他参加过比赛,那么他肯定是他之前的状态(之前不是冠军现在怎么打都不能当冠军,输了的记录不会被抹去,之前是冠军现在赢了依然可能是冠军,不做更新)。
对于输了的人,不管他之前状态,这局输了就注定和冠军无缘,状态为-1。
最后只需要扫描哪些人有冠军的能力,人数为1才是冠军。
代码:
#include"stdio.h" #include"iostream" #include"string.h" #include"queue" #include"map" #include"string" using namespace std; const int N = 1005; int main() { int n; while(scanf("%d",&n),n) { map <string,int> mp; map <string,int> ::iterator it; char s1 ,s2 ; for(int i=1; i<=n; i++) { scanf("%s %s",s1,s2); if(mp[s1]==0) mp[s1]=1; mp[s2]=-1; } int ans=0; for(it=mp.begin(); it!=mp.end(); it++) if(it->second==1) ans++; if(ans==1) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- linux 串口编程
- Android的5样的调试信息
- 英语中的时态
- 浅谈多核CPU、多线程、多进程
- 冒泡排序轻松又容易
- python 当派生类找不到属性、方法时会怎么办
- Maven工程产生Jar时Main-Class和Class-Path的配置文件
- Android RecyclerView 使用完全解析 体验艺术般的控件
- 测试工程师的严肃游戏
- Java的String类中常用方法举例
- C/C++_static函数与普通函数
- ZOJ 3886 Nico Number(线段树单点更新+找规律)
- iOS计算缓存大小、清除缓存
- 查找组成一个偶数最接近的两个素数
- Django中的request.GET和request.POST
- IOS开发判断是否第一次使用软件且下次app自动更新后再次打开还是第一次使用
- CDN服务上线,DNSPOD布局云端生态圈
- linux shell 字符串操作(长度,查找,替换)详解
- HDOJ-2002-计算球体积
- POJ3264Balanced Lineup【RMQ模板】