zoukankan      html  css  js  c++  java
  • HUD 2094 产生冠军

    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
    #include<bits/stdc++.h>
    using namespace std;
    
    map<string,int>q;
    int n,din[1010],dout[1010],ans,id;
    string s1,s2;
    
    int main()
    {
        while(~scanf("%d",&n))
        {
            if(n == 0) break;
            id = 1;
            ans = 0;
            q.clear();
            for(int i = 1;i < 2 * n; ++i)
                din[i] = dout[i] = 0;
            for(int i = 0;i < n; ++i)
            {
                cin>>s1;
                cin>>s2;
                if(!q[s1]) q[s1] = id++;
                if(!q[s2]) q[s2] = id++;
                din[q[s2]]++;//有多少人指向自己
                dout[q[s1]]++;//自己指向别人有多少个
            }
            for(int i = 1;i < id; ++i)
                if(din[i] == 0) ans++;//这道题只要寻找入度为0的点就好,因为冠军就是入度为0的那一个,如果形成环,就不可能存在冠军
            if(ans == 1) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/RootVount/p/10813478.html
Copyright © 2011-2022 走看看