产生冠军

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

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 题解:总人数减去失败的人等于一 ,也就是只有一个人没失败过;handsome借此总结了一条名言:打败最吊的人,你就最吊了,哪怕这个吊人赢得再多;一组数据就可以验证此句名言:
a b
a c
a d
a x
g a
答案为6-5=1;g最吊;;;;;;
代码:
 #include<cstdio>
#include<iostream>
#include<string>
#include<set>
using namespace std;
int main(){int n;string a,b;
while(scanf("%d",&n),n){
set<string>tot;
set<string>looser;
while(n--)cin>>a>>b,tot.insert(a),tot.insert(b),looser.insert(b);
if(tot.size()-looser.size()==)puts("Yes");
else puts("No");
}
return ;
}

map题解:胜利的每次+1,失败的直接赋值无穷小;最后判断为正的个数是否为一;

代码:

 #include<iostream>
#include<map>
#include<string>
#define INF -0xffff
using namespace std;
int main(){
map<string,int>player;//注意由于下面是player[a],a,b是字符串,所以string在前;
map<string,int>::iterator iter;//
string a,b;int n,flot;
while(scanf("%d",&n),n){player.clear();flot=;
while(n--)cin>>a>>b,player[a]++,player[b]=INF;
for(iter=player.begin();iter!=player.end();iter++){
if(iter->second>=)flot++;
}
if(flot==)puts("Yes");
else puts("No");
}
return ;
}

拓扑结构+邻接表:

 #include<string.h>
#include<queue>
#include<map>
#include<string>
#include<stdio.h>
using namespace std;
const int MAXN=;
int que[MAXN];
struct Node{
int to,next;
};
Node edg[MAXN];
int head[MAXN];
map<string,int>mp;
int k;
priority_queue<int,vector<int>,greater<int> >dl;
void topu(){
for(int i=;i<k;i++){
if(!que[i])dl.push(i);
}
if(dl.size()==)puts("Yes");
else puts("No");
}
void initial(){
memset(head,-,sizeof(head));
memset(que,,sizeof(que));
mp.clear();
while(!dl.empty())dl.pop();
k=;
}
int main(){
int n;
char s1[],s2[];
while(~scanf("%d",&n),n){
initial();
for(int i=;i<n;i++){
scanf("%s%s",s1,s2);
if(!mp.count(s1))mp[s1]=k++;
if(!mp.count(s2))mp[s2]=k++;
edg[i].to=mp[s2];
edg[i].next=head[mp[s1]];
head[mp[s1]]=i;
que[mp[s2]]++;
}
topu();
}
return ;
}

产生冠军(set,map,拓扑结构三种方法)的更多相关文章

  1. Java原来如此-遍历Map的三种方法

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; pub ...

  2. 【Golang 接口自动化07】struct转map的三种方式

    背景 我们在前面介绍过怎么使用net/http发送json或者map数据,那么它能不能直接发送结构体数据呢?我们今天一起来学习结构体struct转map的三种方法,为后续做铺垫. struct转map ...

  3. Java中Map的三种遍历方法

    Map的三种遍历方法: 1. 使用keySet遍历,while循环: 2. 使用entrySet遍历,while循环: 3. 使用for循环遍历.   告诉您们一个小秘密: (下↓面是测试代码,最爱看 ...

  4. 两个Map的对比,三种方法,将对比结果写入文件。

    三种方法的思维都是遍历一个map的Key,然后2个Map分别取这2个Key值所得到的Value. #第一种用entry private void compareMap(Map<String, S ...

  5. map的三种遍历方法!

    map的三种遍历方法!   集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ /* * To change this template, choose Tools | Te ...

  6. Spring使用jdbcJdbcTemplate和三种方法配置数据源

    三种方法配置数据源 1.需要引入jar包:spring-jdbc-4.3.2.RELEASE.jar <!-- spring内置,springJdbc,配置数据源 --> <bean ...

  7. Map的三种遍历方式

    对于Map的三种方式遍历 1.keySet() 2.values() 3.entrySet()三种方式得到Set之后,都可以使用 foreach或者iterator, 不能使用for,因为数据结构决定 ...

  8. 转载:遍历Map的四种方法

    http://www.cnblogs.com/kristain/articles/2033566.html 遍历Map的四种方法 public static void main(String[] ar ...

  9. struts2的action访问servlet API的三种方法

    学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...

随机推荐

  1. copy模块

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #copy复制对象 #作用:提供一些函数,可以使用潜复制和深复制进行 ...

  2. Hibernate框架增删改查测试类归为一个类

    package cn.happy.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org ...

  3. 图解server端网络架构

    这篇是计算机类的优质首发推荐>>>><图解server端网络架构> 467张图表讲透构建高可用高性能server实战 写给网络架构师 serverproject师的 ...

  4. qt 操作excel表格

     自己编写的一个Qt C++类,用于操作excel表格,在Qt中操作excel需在.pro中增加CONFIG+=qaxcontainer配置. 1.打开Excel:objExcel = new QAx ...

  5. NO.14 两个div并排,左边为绝对宽度,右边为相对宽度

    两个div并排,左边为绝对宽度,右边为相对宽度,这个问题,我也经常遇到,我一般的处理方法是将最大的容器padding-left固定宽度,左边的固定宽度的一块position:absolute,然后ri ...

  6. 二维计算几何基础题目泛做(SYX第一轮)

    题目1: POJ 2318 TOYS 题目大意: 给一个有n个挡板的盒子,从左到右空格编号为0...n.有好多玩具,问每个玩具在哪个空格里面. 算法讨论: 直接叉积判断就可以.注意在盒子的边界上面也算 ...

  7. POJ 2289 Jamie's Contact Groups (二分+最大流)

    题目大意: 有n个人,可以分成m个组,现在给出你每个人可以去的组的编号,求分成的m组中人数最多的组最少可以有多少人. 算法讨论: 首先喷一下这题的输入,太恶心了. 然后说算法:最多的最少,二分的字眼. ...

  8. 数值的N次方

    问题描述: 实现函数double Power(double base,int exponent),求base的exponent次方.不得使用库函数, 同时不需考虑大数问题. 思路分析: 要是你秒秒钟想 ...

  9. WebBrowser中取对应的图片资源

    在客户端中使用webbrower控件,控件中已显示网页,对应的图片资源应已下载完,下面从缓存中找到图片资源,两种方法都可 1.GetUrlCacheEntryInfo http://msdn.micr ...

  10. poj 3177

    第一道双联通的题目,求加几条边让原图成一个双联通图,求出度数为1的双联通分量的个数+1/2. Low[u]为u或u的子树中能通过非父子边追溯到的最早的节点,即DFS序号最小的节点的序号 #includ ...