题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中1111分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白1111分制和2121分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
题目描述 华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在1111分制和2121分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在1111分制下,此时比赛的结果是华华第一局1111比00获胜,第二局1111比00获胜,正在进行第三局,当前比分11比11。而在2121分制下,此时比赛结果是华华第一局2121比00获胜,正在进行第二局,比分22比11。如果一局比赛刚开始,则此时比分为00比00。直到分差大于或者等于22,才一局结束。
你的程序就是要对于一系列比赛信息的输入(WLWL形式),输出正确的结果。
输入格式 每个输入文件包含若干行字符串,字符串有大写的WW、LL和EE组成。其中EE表示比赛信息结束,程序应该忽略E之后的所有内容。
输出格式 输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是1111分制下的结果,第二部分是2121分制下的结果,两部分之间由一个空行分隔。
这道题难度为普及-,但由于自己实力太菜了,还是做了半个小时。首先查了以下乒乓球11分制和21分制的具体规则,发现其中有一个说明:在11分制下,若双方同时到10分,则首先比对方多得2分者胜出;在21分制下,若双方同时到20分,则首先比对方多得2分者胜出. 处理平局的方法是加入一个平局标志flag,若达到平局下,则判断是否有一方提前比对方多得2分。若无平局情况,则考虑优先达到11分或21分者获胜。 数据结构是用了两种结构体,一种结构体代表每一轮最终的比分结果,有两个成员:left和right,另一种结构体是每一轮的胜场数和败场数。
#include<cstdio> #include<cstdlib> #include<iostream> #define MAXSIZE 62500 typedef struct re { int left,right; }result; typedef struct e { int win_count, lose_count; }every; int main() { char contest[MAXSIZE]; int i = 0, n, count_11 = 0, count_21 = 0; int flag_11 = 0, flag_21 = 0; /* the mark of draw */ every every_11, every_21; every_11.lose_count = every_11.win_count = 0; every_21.lose_count = every_21.win_count = 0; result result_11[10000], result_21[10000]; /* read string */ while((contest[i] = getchar())!='E') i++; getchar(); n = i; /* deal */ for(i=0;i<n;i++) { if(contest[i]=='W') { every_11.win_count ++; every_21.win_count ++; } else if(contest[i]=='L') { every_11.lose_count++; every_21.lose_count++; } /* deal 11 points */ if(every_11.win_count==10 && every_11.lose_count==10) flag_11 = 1; if(flag_11 == 0) { if(every_11.win_count==11 || every_11.lose_count==11) { result_11[count_11].left = every_11.win_count; result_11[count_11].right = every_11.lose_count; count_11++; every_11.win_count = every_11.lose_count=0; } } else if(abs(every_11.win_count - every_11.lose_count)>=2) { result_11[count_11].left = every_11.win_count; result_11[count_11].right = every_11.lose_count; count_11++; every_11.win_count = every_11.lose_count=0; flag_11 = 0; } /* deal 21 points */ if(every_21.win_count==20 && every_21.lose_count==20) flag_21 = 1; if(flag_21 == 0) { if(every_21.win_count==21 || every_21.lose_count==21) { result_21[count_21].left = every_21.win_count; result_21[count_21].right = every_21.lose_count; count_21++; every_21.win_count = every_21.lose_count=0; } } else if(abs(every_21.win_count - every_21.lose_count)>=2) { result_21[count_21].left = every_21.win_count; result_21[count_21].right = every_21.lose_count; count_21++; every_21.win_count = every_21.lose_count=0; flag_21 = 0; } } result_11[count_11].left = every_11.win_count; result_11[count_11].right = every_11.lose_count; result_21[count_21].left = every_21.win_count; result_21[count_21].right = every_21.lose_count; /* print the final result */ for(i=0;i <= count_11;i++) { printf("%d:%d\n",result_11[i].left,result_11[i].right); } printf("\n"); for(i=0;i <= count_21-1;i++) { printf("%d:%d\n",result_21[i].left,result_21[i].right); } printf("%d:%d",result_21[i].left,result_21[i].right); //system("pause"); return 0; }还是要坚持刷题,写博客呀。感觉自己好菜呀/(ㄒoㄒ)/~~,不管是思路还是编码的技巧都很不成熟。自己写出来整道题大概花了一个小时,并且代码长度达到了100行+,怎么看都不太好意思。。。。然后看了洛谷上一些大佬的代码,发现只需要一次判断就可以了,即双方分差大于2且存在一方分数大于11或21,并且将11分制和21分制放在两个循环中处理,这样代码可读性更高了。。膜(ノ*・ω・)ノ 大佬代码的链接