洛谷P1042$\lceil$NOIP2003提高组$\rfloor$题解

P1042乒乓球
$NOIP2003\;tg\;Day_1T_1$

题目背景

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

题目描述

华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和
21分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜。
正在进行第三局,当前比分1比1。

而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。

如果一局比赛刚开始,则此时比分为0比0。直到分差大于或者等于2,才一局结束。

你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。

输入输出格式

输入格式

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

输出格式

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

INPUT & OUTPUT’s example

Input’s example

1
2
WWWWWWWWWWWWWWWWWWWW
WWLWE

Output’s example

1
2
3
4
5
6
11:0
11:0
1:1

21:0
2:1

说明

每行至多25个字母,最多有2500行

分析

我们开一个char类型的变量,然后用while(cin>>s)进行输入。

然后在输入过程中,把11分制和21分制下的双方得分分别用4个int记下来。

最后根据得分处理即可。

要点

tips1:

程序应该忽略E之后的所有内容。

tips2:

如果一局比赛刚开始,则此时比分为0比0。直到分差大于或者等于2,才一局结束。

tips3:

两部分之间由一个空行分隔。

注意细节是AC的前提。

代码

毒瘤警告

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/* Headers */
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
/* define */
#define MAXN 10000010

namespace FastIO{
const int BUFSIZE=(1<<20);
char ibuf[BUFSIZE],*is=ibuf,*it=ibuf;
char obuf[BUFSIZE],*os=obuf,*ot=obuf+BUFSIZE;
inline char getch(){
if(is==it)
it=(is=ibuf)+fread(ibuf,1,BUFSIZE,stdin);
return (is==it)?EOF:*is++;
}
inline int getint(){
int res=0,neg=0,ch=getch();
while(!(isdigit(ch)||ch=='-')&&ch!=EOF)
ch=getch();
if(ch=='-'){
neg=1;ch=getch();
}
while(isdigit(ch)){
res=(res<<3)+(res<<1)+(ch-'0');
ch=getch();
}
return neg?-res:res;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void space(int x){
if(x!=0) putchar(' ');
else putchar('\n');
}
}
using namespace FastIO;
/* definitions */
char a;
int elea,twea,eleb,tweb,x[MAXN][2],j;
/* functions */
int main(){
while(cin>>a&&a!='E'){
if(a=='W'){elea++;twea++;}
if(a=='L'){tweb++;eleb++;}
if((elea>=11&&elea-eleb>=2)||(eleb>=11&&eleb-elea>=2)){printf("%d:%d\n",elea,eleb);elea=0;eleb=0;};
if((twea>=21&&twea-tweb>=2)||(tweb>=21&&tweb-twea>=2)){x[j][0]=twea;x[j][1]=tweb;twea=0;tweb=0;j++;};
}
printf("%d:%d\n\n",elea,eleb);
for(int i=0;i<j;i++)
printf("%d:%d\n",x[i][0],x[i][1]);
printf("%d:%d",twea,tweb);
return 0;
}

THE END