• 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;
    }
  • 相关阅读:
    webpack基础理解以及使用搭建
    前端优化系列之一:dns预获取 dns-prefetch 提升页面载入速度
    react 什么是虚拟DOM?深入了解虚拟DOM
    react PropTypes 与 DefaultProps
    react todolist代码优化
    react 拆分组件于组件
    react 部分语法补充
    react 的安装和案列Todolist
    浏览器的标准模式和怪异模式
    软件测试基础——慕课网
  • 原文地址:https://www.cnblogs.com/RootVount/p/10813478.html
Copyright © 2020-2023  润新知