HDU -2094产生冠军 (STL)

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
题目链接
WFU寒假训练<十二>
考查容器
思路1
用map写,1代表胜利 2代表失败 循环一遍以后把数组所有值初始化为3 最后统计胜利的人数即可,若ans==1则输出 Yes,反之输入No。(AC代码)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
map<string,int>m;
int main()
{
	map<string,int> ::iterator it;
	int n;
	while(cin>>n&&n)
	{
		for(int i=0;i<n;i++)
		{
			string s1,s2;
			cin>>s1;
			if(m[s1]!=2)
			  m[s1]=1;
			cin>>s2;
			m[s2]=2;
		}
		int ans=0;
		for(it=m.begin();it!=m.end();it++)
		  if(it->second==1)
		    ans++;
		if(ans==1)
		  cout<<"Yes"<<endl;
		else
		  cout<<"No"<<endl;
		for(it=m.begin();it!=m.end();it++)
		  it->second=3;
	}
	return 0;
}

思路2
用set写 开两个set s1,s2 s1存放比赛的总人数 s2存放 失败的人数 由于冠军只有一个,利用set的去重功能 最后判断s1.size()-s2.size是否等于1 等于一输出Yes 反之输出No,贴AC代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
int main()
{
	int n;
	string s;
	while(cin>>n&&n)
	{
		set<string> s1;
		set<string> s2;
		for(int i=1;i<=n;i++)
		{
			cin>>s;
		    s1.insert(s);
		    cin>>s;
		    s1.insert(s);
		    s2.insert(s);
		}
		if((s1.size()-s2.size())==1)
		  cout<<"Yes"<<endl;
		else
		  cout<<"No"<<endl;
	}
	return 0;
} 
posted @ 2020-02-17 16:09  Hayasaka  阅读(41)  评论(0编辑  收藏  举报