2383: 【普及-】【P1042】乒乓球

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:38 解决:12

题目描述

国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 lns="http://www.w3.org/1998/Math/MathML">11 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 lns="http://www.w3.org/1998/Math/MathML">11 分制和 lns="http://www.w3.org/1998/Math/MathML">21 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

题目描述

华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 lns="http://www.w3.org/1998/Math/MathML">11 分制和 lns="http://www.w3.org/1998/Math/MathML">21 分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录,(其中 lns="http://www.w3.org/1998/Math/MathML">W 表示华华获得一分,lns="http://www.w3.org/1998/Math/MathML">L 表示华华对手获得一分):

lns="http://www.w3.org/1998/Math/MathML">WWWWWWWWWWWWWWWWWWWWWWLW

在 lns="http://www.w3.org/1998/Math/MathML">11 分制下,此时比赛的结果是华华第一局 lns="http://www.w3.org/1998/Math/MathML">11 比 lns="http://www.w3.org/1998/Math/MathML">0 获胜,第二局 lns="http://www.w3.org/1998/Math/MathML">11 比 lns="http://www.w3.org/1998/Math/MathML">0 获胜,正在进行第三局,当前比分 lns="http://www.w3.org/1998/Math/MathML">1 比 lns="http://www.w3.org/1998/Math/MathML">1。而在 lns="http://www.w3.org/1998/Math/MathML">21 分制下,此时比赛结果是华华第一局 lns="http://www.w3.org/1998/Math/MathML">21 比 lns="http://www.w3.org/1998/Math/MathML">0 获胜,正在进行第二局,比分 lns="http://www.w3.org/1998/Math/MathML">2 比 lns="http://www.w3.org/1998/Math/MathML">1。如果一局比赛刚开始,则此时比分为 lns="http://www.w3.org/1998/Math/MathML">0 比 lns="http://www.w3.org/1998/Math/MathML">0。直到分差大于或者等于 lns="http://www.w3.org/1998/Math/MathML">2,才一局结束。

**注意:**当一局比赛结束后,下一局立刻开始。

你的程序就是要对于一系列比赛信息的输入(lns="http://www.w3.org/1998/Math/MathML">WL 形式),输出正确的结果。

输入

每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的WLE组成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。

 

输出

输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。

样例输入 复制

WWWWWWWWWWWWWWWWWWWW
WWLWE

样例输出 复制

11:0
11:0
1:1

21:0
2:1

提示


说明/提示

每行至多 lns="http://www.w3.org/1998/Math/MathML">25 个字母,最多有 lns="http://www.w3.org/1998/Math/MathML">2500 行。

(注:事实上有一个测试点有 lns="http://www.w3.org/1998/Math/MathML">2501 行数据。)


分析:

根据题意,只需要对读入的内容进行统计即可。使用数组 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。