产生冠军

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

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

解题思路:这道题我用了STL容器中的set,就是把所有赢的人的名字存入set容器中,然后用了两个双重循环遍历,如果赢的人中有曾经输过的,就从set中删除,最后判断如果容器大小为

一就输出yes,否则输出no;

另外有一个小坑点就是最后要用clear()清理set容器,不然会wa;

代码如下(AC):

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
set<string> v1;
int main(){string str1[1010],str2[1010];int n;while(cin>>n,n){for(int i=0;i<n;i++){cin>>str1[i]>>str2[i];v1.insert(str1[i]);}for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(str1[i]==str2[j])v1.erase(str1[i]);}}if(v1.size()==1) printf("Yes\n");else printf("No\n");v1.clear();}return 0;
}

顺便补一下STL的set容器知识:

在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。

set使用方法:

begin()     ,返回set容器的第一个迭代器

end()      ,返回set容器的最后一个迭代器

clear()        ,删除set容器中的所有的元素

empty()    ,判断set容器是否为空

max_size()   ,返回set容器可能包含的元素最大个数

size()      ,返回当前set容器中的元素个数

rbegin     ,返回的值和end()相同

rend()     ,返回的值和rbegin()相同

简单的操作实例:

#include <iostream>
#include <set>  using namespace std;  int main()
{  set<int> s;  s.insert(1);  s.insert(2);  s.insert(3);  s.insert(1);  cout<<"set 的 size 值为 :"<<s.size()<<endl;  cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;  cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;  cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;  s.clear();  if(s.empty())  {  cout<<"set 为空 !!!"<<endl;  }  cout<<"set 的 size 值为 :"<<s.size()<<endl;  cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;  return 0;
}

小结:插入3之后虽然插入了一个1,但是我们发现set中最后一个值仍然是3哈,这就是set 。还要注意begin() 和 end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空.

count()方法:

count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。

实例代码:

#include <iostream>
#include <set>  using namespace std;  int main()
{  set<int> s;  s.insert(1);  s.insert(2);  s.insert(3);  s.insert(1);  cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;  cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;  return 0;
}

erase()方法:

erase(iterator)  ,删除定位器iterator指向的值

erase(first,second),删除定位器first和second之间的值

erase(key_value),删除键值key_value的值

#include <iostream>
#include <set>  using namespace std;  int main()
{  set<int> s;  set<int>::const_iterator iter;  set<int>::iterator first;  set<int>::iterator second;  for(int i = 1 ; i <= 10 ; ++i)  {  s.insert(i);  }  //第一种删除
    s.erase(s.begin());  //第二种删除  first = s.begin();  second = s.begin();  second++;  second++;  s.erase(first,second);  //第三种删除  s.erase(8);  cout<<"删除后 set 中元素是 :";  for(iter = s.begin() ; iter != s.end() ; ++iter)  {  cout<<*iter<<" ";  }  cout<<endl;  return 0;
}

小结:set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。

find()方法:

find()  ,返回给定值值得定位器,如果没找到则返回end()。

#include <iostream>
#include <set>using namespace std;int main()
{int a[] = { 4, 6, 2 , 3};set<int> s(a,a + 4);set<int>::iterator iter;for(iter = s.begin();iter != s.end();iter++){cout << *iter << "  " ;}cout << endl;if((iter = s.find(2)) != s.end())cout<<*iter<<endl;if((iter = s.find(1)) != s.end())cout<<*iter<<endl;return 0;
}

运行结果:

2 3 4 6

2

小结:find(x)是返回的是x的值,如果x没有在set中则会输出end();

lower_bound(key_value) ,返回第一个大于等于key_value的定位器

upper_bound(key_value),返回最后一个大于key_value的定位器

#include <iostream>
#include <set>using namespace std;int main()
{set<int> s;for(int i = 1;i <= 5;i ++){int x;cin >> x;s.insert(x);}set<int>::iterator iter;for(iter = s.begin() ; iter != s.end() ; ++iter){cout << *iter << " ";}cout << endl;cout << "第一个大于等于 2 的值是:   ";cout<<*s.lower_bound(2)<<endl;cout << "第一个大于等于 3 的值是:   ";cout<<*s.lower_bound(3)<<endl;cout << "第一个大于 3 的值是:   ";cout<<*s.upper_bound(3)<<endl;return 0;
}

转载于:https://www.cnblogs.com/jianqiao123/p/11329908.html

HDU2094 产生冠军相关推荐

  1. HDU2094 产生冠军【set】

    产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. hdu2094产生冠军

    http://acm.hdu.edu.cn/showproblem.php?pid=2094 其实这题也不算是拓扑排序了 只需要判断最开始入度是否唯一就可以了 如果是0  肯定有环了 不是0 会有多个 ...

  3. HDU-2094 产生冠军

    题中先用并查集判定是否所有点都有联系,即能够拼成一个连通的无向图. 再判定入度为零的点是否为1即可. 代码如下: #include <stdio.h> #include <strin ...

  4. 【ACM】HDU.2094 产生冠军 【STL-map】

    题目链接 问题分析: 题意: rule1:胜负关系具有传递性 rule2:胜负关系形成闭环时,则闭环内的都不可能是冠军 所以大胆猜测,只要输过一次的人就不可能是冠军,统计最后没有输过的人数,若为1,则 ...

  5. CCF认证训练行动路线图

    通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...

  6. c语言折半查找法找字符,C语言折半查找法练习题冒泡排序

    MongoDB管理工具的插件系统 MongoDB管理工具  MongoCola的开发已经进入第三个年头了. 官方对于C#驱动的投入不够导致了很多东西都必须自己实现,但是不管怎么样,工具现在已经很强大了 ...

  7. TYUT-A2专题题解

    TYUT-A2专题题解 循序渐进,基础练起. 01递推与组合 HDU1210 Eddy's 洗牌问题[递推函数+模拟] - 海岛Blog - CSDN博客 HDU2044 一只小蜜蜂...[递推] - ...

  8. ICPC程序设计题解书籍系列之九:罗勇军《算法竞赛入门到进阶》

    罗书<算法竞赛入门到进阶>题目一览 第1章 算法竞赛概述 HDU1000 HDU1089-HDU1096 A+B for Input-Output Practice (I)-(VIII)( ...

  9. TYUT-A专题题解(一)

    TYUT-A专题题解(一) 01A Ad Hoc UVA353 LA5247 Pesky Palindromes[回文] - 海岛Blog - CSDN博客 UVA947 Master Mind He ...

最新文章

  1. Oracle下载汇聚
  2. POJ 2455 Secret Milking Machine (二分+无向图最大流)
  3. [ CCO 2015 ] Artskjid
  4. Windowsw核心编程 第13章 Windows内存结构
  5. 自定义的调试函数clr/c++
  6. [ASP.NET Core] Static File Middleware
  7. nginx模块_使用gdb调试nginx源码
  8. php 虚基类,1.9 多态
  9. 数学--数论--积性函数(初步)
  10. 2106. [NOIP2015] 斗地主
  11. 来自intlsy‘s省选debug方法
  12. 计算机大学英语值最高的3项,计算机等级考试一级B上机试题:Windows字处理
  13. Android GridView 分页加载数据
  14. 计算机桌面如何分区,学会电脑桌面整理分区,提高工作效率
  15. html5音乐播放器网页底部,jQuery+html5网页底部固定mp3音乐播放器代码
  16. malloc 是如何分配内存的?
  17. Spring boot启动报错ERROR 5208 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter
  18. 求两个数的最大公约数,Euclid算法证明,以及C语言代码实现
  19. 第三章 变量和数据类型_C语言中的小数(float,double)
  20. 免费开发工具与IAR工具的比较

热门文章

  1. 又遇到问题:wrong ELF class: ELFCLASS32 in Unknown on line
  2. python大数据和java大数据的区别-未来Java、大数据、Python哪个前景更好,薪资更高?...
  3. python是一种什么类型的编程语言-Python这么火,为什么说它不是未来的编程语言?...
  4. python软件开发-有哪些值得推荐的 Python 开发工具?
  5. python推荐书籍-有哪些 Python 经典书籍?
  6. 爬虫python书籍-Python爬虫案例:抓取豆瓣编程类高评分书籍
  7. 零基础学python需要多久-零基础学习Python大概要多久,感悟分享?
  8. python软件怎么运行-python软件怎么用
  9. python编程 入门到实践-Python编程入门到实践(二)
  10. python之父去面试-前端两年月入30K,高频面试题整理(含答案)