您的位置:首页 > 其它

产生冠军 2094(map和set的结合使用)

2014-11-28 09:45 369 查看


产生冠军

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 9314    Accepted Submission(s): 4384


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

 

一,使输的人指向打败他的人,到最后如果剩下一个人没有指向任何人,那么他就是冠军



这个问题是因为数组开的太小了

#include<cstdio>

#include <set>

#include <map>

#include <string>

#include <iostream>

using namespace std;

int main()

{
int n;
while (scanf("%d",&n),n)
{
int sum=0,i;
string a,b;
set<string>s;//用于存放比赛选手
set<string>::iterator it;
map<string, string>m;//用于映射胜者和败者直接的关系
for (i=1;i<=n;i++)
{
cin>>a>>b;
s.insert(a);
s.insert(b);
m[b]=a;
}
for (it=s.begin();it!=s.end();it++)
{
if (m[*it].empty()==1)
{
sum++;
}
}
printf(sum==1?"Yes\n":"No\n");
}

return 0;

}

二,因为比赛里只要有一个人没输过,他就是冠军,只要总的人数减去输的人数,如果剩下一个,那么他就一定是冠军,否则还不能判断



这个原因是因为要加#include<string>而不是#include<cstring>

#include<cstdio>

#include<string>

#include<cmath>

#include<algorithm>

#include<set>

#include<iostream>

using namespace std;

int main ()

{

    int test;

    string a,b;

    while (scanf("%d",&test),test){

    set<string> st;

    set<string> key;

        for(int i=0; i < test; i++){

        cin>>a>>b;

        st.insert(a);

        st.insert(b);

        key.insert(b);

if(st.size()-key.size()==1)printf("Yes\n");
else printf("No\n");

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: