[NOIP 2003 普及组] 乒乓球 · 教师题解

[NOIP 2003 普及组] 乒乓球

知识点

模拟、字符串、状态维护

解题思路

读取W/L直到第一个E,之后全部忽略。分别按11分制、21分制扫描记录。某方至少达到目标分且净胜至少2分时输出该局并清零;记录结束后总要输出当前局,哪怕为0:0。两套结果间空一行。

正确性说明

每个字符恰为一次得分。状态保存当前局双方累计分数,达到结束条件时输出并清零与规则一致。结束后当前局代表未完比赛或刚开始的新一局,因此必须额外输出一次。两次独立模拟分别完整满足计分规则。

易错点

不能一到11或21就结束,必须净胜两分;恰结束时末尾还有0:0;E之后不得继续计分。

复杂度

时间O(L),空间O(L)保存赛况。

参考代码(GNU C++17)

#include<bits/stdc++.h>
using namespace std;
void show(const string&s,int limit){int a=0,b=0;for(char c:s){if(c=='W')a++;else b++;if(max(a,b)>=limit&&abs(a-b)>=2){cout<<a<<':'<<b<<'\n';a=b=0;}}cout<<a<<':'<<b<<'\n';}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);string s;char c;while(cin>>c){if(c=='E')break;if(c=='W'||c=='L')s+=c;}show(s,11);cout<<'\n';show(s,21);}
返回题目