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形式),输出正确的结果。

输入

每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。

输出

输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。

样例输入 复制

WWWWWWWWWWWWWWWWWWWW
WWLWE

样例输出 复制

11:0
11:0
1:1

21:0
2:1

提示

每行至多25个字母,最多有2500行。

来源

思路

首先一定要开数组存胜负

因为你不仅要存胜负的场数,还要存胜负的顺序,以此来排分数。

玩过乒乓球大部分人都知道,正规乒乓球比赛,不仅分数要大于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;
} 

彩蛋

 

 

不写咯,关机咯~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

posted @ 2022-05-28 18:05  冯子坤  阅读(423)  评论(0编辑  收藏  举报