杭电ACM 2094 产生冠军——C语言)
Hdu 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
分析
① 题意就是,通过输入的对局信息,只能有一个玩家是全胜的,才输出YES,如果有两个或者以上全胜的玩家 或者无法通过对局判断出是否有全胜的玩家时 输入NO
② 规划玩家的二维数组(allName )的存入,由于n<1000,且每次输入两个玩家,前者赢后者输,所以在最多玩家的情况下,即每次输入的对局玩家都不相同时,有2*n个玩家。所以allName长度假定为2000;
③ 每次输入的对局胜者字符串数组name1[],败者字符串数组name2[];
④ 使用len作为标记,如果此次输入的两个玩家没有存入allName 表,就将其存入allName,
⑤ 将每次输入的败者的idx作为数组下标,胜者的idx作为元素存入win[]数组中,
⑥ 由于win[]数组初始化元素为-1,并在每次输入对局信息后只要败者的idx下标才会为改为胜者的idx,,所以全胜的玩家的idx下标为默认值-1,没有改变。
⑦ 最后只需要遍历win[],遇到一个元素为-1的,就sum++,判断sum是否为1即可
代码
#include <stdio.h>
#include <string.h>
int main() {int n,i,j,len;char name1[666]; //每次对局胜者namechar name2[666]; //每次对局败者namechar allName[2000][666]; //最多的情况下有1998个人比赛int win[2000]; //赢的人while(scanf("%d",&n) && n) {len = 0; // allName的下标for(i=0; i<n*2; i++) {win[i]=-1; //初始化win[], -1表示没人赢i,其他表示赢过i的人}for(i=0; i<n; i++) { //输入n次对局scanf("%s%s",name1,name2); //数组输入不用取址符,可以直接输入int idx1 = -1; //对应name1int idx2 = -1; //对应name2/*输入第一组的时候肯定name1,name2肯定都没存入allName,所以开始时len=0,存入一个len++ */for(j=0; j<len; j++) { /*比较s1和s2的字典序大小,s1大返回1,s2大返回-1,相等0*/if(strcmp(allName[j],name1) == 0) { //如果name1已经存入了allName,则修改idx标记idx1=j;}if(strcmp(allName[j],name2) == 0) {idx2=j;}}if(idx1 == -1) { //如果name1没存入过allName,则存入idx1=len;strcpy(allName[len++],name1); //将 name1字符串复制到allName[len++]中}if(idx2 == -1) {idx2 = len;strcpy(allName[len++],name2);}win[idx2]=idx1; //标记name2被name1赢过}int sum =0; //表示全胜的玩家for(i=0; i<len; i++) {if(win[i]==-1) {sum++;}}printf("%s\n",sum == 1 ?"Yes":"No");}return 0;
}
杭电ACM 2094 产生冠军——C语言)相关推荐
- 杭电acm第2304题答案c语言,【转】杭电ACM试题分类
注:网上搜的 第一篇 1001 这个就不用说了吧 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 ...
- 杭电ACM(HDUOJ)试题分类
杭电ACM试题分类 第一篇 1001 这个就不用说了吧 1002 简单的大数 1003 DP经典问题,最 ...
- 杭电ACM题目类型整理
版权声明:(╯3╰) 转载请注明: http://blog.csdn.net/bat67 杭电acm题目分类版本1 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 10 ...
- 【杭电ACM】1097 A hard puzzle
[杭电ACM]1097 A hard puzzle http://acm.hdu.edu.cn/showproblem.php?pid=1097 先用int手写了算法结果竟然wrong answer ...
- 杭电ACM刷题(1):1002,A + B Problem II
最近忙于考试复习,没有多少可供自己安排的时间,所以我利用复习之余的空闲时间去刷刷杭电acm的题目,也当对自己编程能力的锻炼吧. Problem Description I have a very si ...
- 杭电acm2151题java的解法,杭电ACM题型分类
杭电ACM题型分类 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.1032.1037.1040.1048.1 ...
- 杭电acm a+b问题
杭电acm 1000 a+b问题代码 int main() { int a,b; for(;~scanf("%d%d",&a,&b);printf("%d ...
- 杭电ACM 1174
//身高,又称身长,是指一个人从头顶到脚底的身体长度. //杭电ACM 1174 爆头 #include<iostream> #include<cmath> using nam ...
- 杭电oj1620题c语言答案,杭电oj部分水题 c语言源代码.doc
杭电oj部分水题 c语言源代码 殿剐忱酪短祭幂曝沈脸蛀蓑挞姻扶宠秤蓄幌榆矾巨旷于渍弯史影得熄孟椒菊葫彦籍蛛绊趣庙捣载睹答赊索添垛蝎伙生瞎回悟辅篇狱辗歧病氯急迸怜煽跋屋凡逻甲确烧迟卞姻郸被康少辊蒂刽厂礁 ...
最新文章
- 中国民办教育市场需求与运营策略建议报告2022版
- linux小红帽实验心得,格林童话小红帽读书心得体会5篇
- 整理JS+FLASH幻灯片播放图片脚本代码
- 百度地图infowindow的close事件_高德地图,百度地图,腾讯地图哪个更准?
- Delphi 与 DirectX 之 DelphiX(63): TDIB.DoPosterize();
- 【Matlab学习笔记】matlab的编程规则
- 服务器lsass系统错误,电脑开机提示lsass.exe系统错误,安全帐户管理器初始化失败该怎么办?...
- Spring事务如何集成到Mybatis之Mybatis事务
- 入职两个月的一些感受
- 电力设备管理杂志电力设备管理杂志社电力设备管理编辑部2022年第14期目录
- 【Java】根据生日计算年龄
- 软件测试常用的性能测试指标,7个常用的网络性能测试指标
- 大疆aeb连拍_不适合航拍?不如深度发掘大疆spark拍照功能
- android4.4 fragment,在Activity和多个Fragment之间共享资源
- 华为云发布实时音视频行业加速器,为企业解决技术与商业双重难题
- c语言中执行cl exe时出错,VC6.0执行cl.exe时出错
- 剑指offer:顺时针打印矩阵(Python)
- 考研 英语一 大作文-图画作文 (一)----第一段描述图画写作攻略
- 有理数集合是可数集合,无理数集合是不可数集合
- 全国各省市县级边界范围及其中心城区查询(调用百度地图)