2383: 【普及-】【P1042】乒乓球
题目描述
国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 分制和 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
题目描述
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 分制和 分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中 表示华华获得一分, 表示华华对手获得一分):
在 分制下,此时比赛的结果是华华第一局 比 获胜,第二局 比 获胜,正在进行第三局,当前比分 比 。而在 分制下,此时比赛结果是华华第一局 比 获胜,正在进行第二局,比分 比 。如果一局比赛刚开始,则此时比分为 比 。直到分差大于或者等于 ,才一局结束。
**注意:**当一局比赛结束后,下一局立刻开始。
你的程序就是要对于一系列比赛信息的输入( 形式),输出正确的结果。
输入
每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。
输出
输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
样例输入 复制
WWWWWWWWWWWWWWWWWWWW
WWLWE
样例输出 复制
11:0
11:0
1:1
21:0
2:1
提示
说明/提示
每行至多 个字母,最多有 行。
(注:事实上有一个测试点有 行数据。)
分析:
根据题意,只需要对读入的内容进行统计即可。使用数组 a 来记录下从最开始到结束的得分情况,如果是华华赢了就记为1,反之记为0。读到E的时候直接就不再继续读人,而读到换行符时也直接忽略。同时要记录他们一共打了几球(就是 n)。然后分别对两种赛制进行计算。首先计分板上双方都是0。如果华华赢了,w 就增加1,否则 l 就增加1。如果发现计分板上得分高的一方达到了赛制要求的球数,而且分差也足够就将计分板的得分输出,同时计分板清零开始下一局。到最后还要输出正在进行中的比赛的得分。
#include<bits/stdc++.h> #define MAXN 25*2501 int a[MAXN]; using namespace std; int main(){ int n=0; char tmp; int f[2]={11,21}; //两种赛制的获胜得分 while(1){ cin>>tmp; //不断读入结果 if (tmp=='E') break; else if (tmp=='W') a[n++]=1; //华华赢 else if (tmp=='L') a[n++]=0; //华华输 } for (int k=0;k<2;k++) { //两种赛制循环 int w=0,l=0; for (int i=0;i<n;i++) { w+=a[i]; l+=1-a[i]; if (max(w,l)>=f[k] && abs(w-l)>=2) { //获胜者超过对应分数且超出对手2分 cout<<w<<":"<<l<<endl; w=l=0; } } cout<<w<<":"<<l<<endl; cout<<endl; } return 0; }
本题思路很简单,直接根据题意和生活常识模拟运算,但是还是有一些需要注意的地方:
1)数组要开够,至少需要容纳 25x2500 条得分记录。
2)读到E就停止读入了,后面的都忽略掉。同时遇到换行符等也要忽略。
3)注意要分差2分以上才能结算一局的结果。
4)最后还要输出正在进行中的比赛,就算是刚刚完成一局也要输出0:0。