P1042 [NOIP2003 普及组] 乒乓球 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 1111 分制和 2121 分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中 WW 表示华华获得一分,LL 表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLWWWWWWWWWWWWWWWWWWWWWWWLW
在 1111 分制下,此时比赛的结果是华华第一局 1111 比 00 获胜,第二局 1111 比 00 获胜,正在进行第三局,当前比分 11 比 11。而在 2121 分制下,此时比赛结果是华华第一局 2121 比 00 获胜,正在进行第二局,比分 22 比 11。如果一局比赛刚开始,则此时比分为 00 比 00。直到分差大于或者等于 22,才一局结束。
你的程序就是要对于一系列比赛信息的输入(WLWL 形式),输出正确的结果。
题目解析
本题坑点:
1.第一个字符可能是E,后面不读取。 样例数据例如:EWLWLW。
2.两场比赛刚好打完,输入数据例如:WWWWWWWWWWWLLLLLLLLLLLE。
代码如下
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int n,m;
char s[65000]; //使用char来存储字符串。
vector<int> A; //定义int型矢量表。
int a1,a2,a3,a4;
bool Efirst = false; //定义布尔型变量来表示第一个是否为E,避坑题目中#1测试点。
int main(){
int i = 0; //下标
while(cin >>s[i] && s[i] != 'E' ){ //一直读入直到字符为'E'停止。
i++; //下标自增加
}
int n = strlen(s); //求出char表的长度。
for(int j = 0;j<n;j++) A.push_back(s[j] - 'V'); // 进入到int 矢量表。
if(A[n-1] == -17) A.pop_back(); //如果最后一个是E,则删除。
if(A.size() == 0)Efirst = true;
if(!Efirst){
for(int j = 0;j<A.size();j++){
if(A[j] == 1){
a1++;
}
if(A[j] == -10){
a2++;
}
if((a1 >= 11 || a2 >= 11) && abs(a1-a2) >= 2 ){ // 如果两个人有一个获得了11分以上且分差大于两分,则输出比分。
cout << a1 << ":" << a2 <<endl;
a1 = 0;
a2 = 0;
}
}
cout << a1 << ":" << a2 << endl;
}
else{
cout << "0:0" << endl; //如果第一个为E则输出“0:0。
}
cout << endl;
if(!Efirst){
for(int j = 0;j<A.size();j++){
if(A[j] == 1){ //int型 1 代表'W',自己获得的分数
a3++;
}
if(A[j] == -10){ // int型-10 代表 'L',对手获得分数
a4++;
}
if((a3 >= 21 || a4 >= 21) && abs(a3-a4) >= 2){
cout << a3 << ":" << a4 << endl;
a3 = 0;
a4 = 0; // 重置比分
}
}
cout << a3 << ":" << a4<<endl;
}
else{
cout << "0:0" << endl;
}
return 0;
}
注:本人弱媾,大佬勿喷。