zoukankan      html  css  js  c++  java
  • set的使用-Hdu 2094

    产生冠军

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


    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
     
    理解题意:
    这个题很容易理解为最后的冠军为间接赢了所有人的选手,但其实冠军是所有选手中没有输过的那一个
     
    解题思路:
    利用集合set中的元素只出现一次的特性,把输入的所有选手都放到一个集合A中,失败的选手放到集合B中,如果A比B多一个,则说明产生了冠军
     
    代码:
    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main()
    {
        set<string>A,B;
        string s1,s2;
        int n;
        while(cin>>n&&n){
            for(int i =0 ;i < n; i++){
                cin>>s1>>s2;
                A.insert(s1);
                A.insert(s2);
                B.insert(s2);
            }
            if(A.size()-B.size()==1)
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl; 
            A.clear();
            B.clear();
        }
        return 0;
    }
  • 相关阅读:
    内存泄露了么: Handlers & Inner Classes
    SVN update: 'skipped' message
    Eclipse Java注释模板设置详解
    Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported
    简单的SocketExample
    Struts2+JSON+JQUERY DEMO
    Checked&Unchecked Exception
    js垃圾回收机制
    Vue中路由守卫
    Vue中Watch和Computed的差异
  • 原文地址:https://www.cnblogs.com/jingshixin/p/12241793.html
Copyright © 2011-2022 走看看