[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);}