洛谷P1042乒乓球

1. 题目描述

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

比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):

WWWWWWWWWWWWWWWWWWWWWWLW

在1111分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。直到分差大于或者等于2,才一局结束。

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

2. Notes

2.1. 关于题目中的读取文件

OJ不需要“实质性”的文件读入,即他说读取数据时其实就是通过标准输入(e.g. cin)来实现。而且只要是读取就一定有终止符

2.2. 关于while(cin>>x)输入的理解

可以类似于a+b 进行理解,cin是一个标准输入流对象,>>是一个运算符,cin>>x的意思就是cinx进行运算符为>>的运算,得到的结果还是一个标准输入流对象,即还是cin这个对象,一般都是非0值(true),除非下一个字符是EOF

注:windows系统下EOFctrl+z,Linux系统下为ctrl+d

2.3. 书写规范用好小括号

每一组逻辑运算一定要严格地加好括号,不要怕麻烦,如果因为表意不清程序可以运行但就是不是自己想要的结果,debug起来将很困难,因为你可能觉得自己就是对的(实际上可能你逻辑也就是对的,但由于你的表达不规范,编译器理解错了)。

2.4. 关于break和continue

breakcontinue会找到距离他最近的且他能影响的一个关键词去影响。

比如,最常见的就是循环,如果一个循环里面套两层if(类似于while(if(if break))),在最内层的if中执行break或continue影响的是据他最近且他能影响到的关键词(此例中就是直接终止while循环,剩下的代码全部不执行

2.5. 少用unsigned

即使你要用该变量表达的数全是非负数也要慎重考虑,除非你能保证他不会和其余的数做减法,得到一个小于0的数无法表示而溢出!(如题解中的a,b)

2.6. 拆题目马甲

乒乓球11分制比赛中,一局比赛结束,要求两人中至少一人拿到11分,且两人分差大于等于两分

3. 题解

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
#include<iostream>
#include<cmath>
using namespace std;
int main(){
char c;
char sv[62520]; //25*2500 输入文件的说明有说明
int a,b,i;
a=b=i=0;
//因为要用两次,用数组存起来
while(cin>>c && c != 'E'){
sv[i] = c;
i++;
}
sv[i] = 'E';

i=0;
while(sv[i] !='E'){
if(sv[i]=='W'){
a++;
}
else if(sv[i]=='L'){
b++;
}
i++;
if(abs(a-b)>1){
if(a>=11 or b>=11){
cout<<a<<":"<<b<<endl;
a=0;b=0;
}
}
}
cout<<a<<":"<<b<<endl;
a=0;b=0;

cout<<endl;

i=0;
while(sv[i] !='E'){
if(sv[i] == 'W'){
a++;
}
else if(sv[i] =='L'){
b++;
}
i++;
if(abs(a-b)>1){
if(a>=21 or b>=21){
cout<<a<<":"<<b<<endl;
a=0;b=0;
}
}
}
cout<<a<<":"<<b<<endl;

return 0;
}