C++-乒乓球(NOIP 2003 PJT1) 解题思路
【Horn Studio】编程专栏: 乒乓球(NOIP 2003 PJT1) 解题思路
题目
题目描述
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。
你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。
输入
输出
输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
样例输入 复制
WWWWWWWWWWWWWWWWWWWW
WWLWE
样例输出 复制
11:0
11:0
1:1
21:0
2:1
提示
来源
思路
首先一定要开数组存胜负
因为你不仅要存胜负的场数,还要存胜负的顺序,以此来排分数。
玩过乒乓球大部分人都知道,正规乒乓球比赛,不仅分数要大于11(或21),两者分数相差也要大于2。
如果比赛分数达到11-10,比赛会继续。直到一个人比另外一个人多两分。
21分制同理
我是把输入、11分制、21分制一起记录,毕竟一个函数。只开了一个数组。初始值为0(开全局变量),当录到W赋值1(胜),录到L赋值2(负)。方便下面取用。
取用时,读到1,胜数++,读到二,负数++,按照上文判定来输出,读到0,表明记录结束了,输出之前剩余的分数即可。
简洁版:
- 要么一次性读取数据后面再慢慢判断
- 要么边输入边判断两种情况,不过答案要先存起来
代码
#include<bits/stdc++.h> using namespace std; char str[1000001]; char a; int cnt=0; void ccl(int n){ int a=0,b=0; for(int i=1;i<=cnt;i++){ if(str[i]=='W'){ a++; }if(str[i]=='L'){ b++; }if((a>=n||b>=n)&&abs(a-b)>=2){ cout<<a<<":"<<b<<endl; a=b=0; } }cout<<a<<":"<<b<<endl; return; } int main(){ while(cin>>a&&a!='E'){ if(a=='W'||a=='L'){ cnt++; str[cnt]=a; } }ccl(11); cout<<endl; ccl(21); return 0; }
彩蛋
不写咯,关机咯~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~