PTA h.0094 乒乓球

乒乓球问题的题目与C++解

题目描述:

国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。

其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。

华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。

在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在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

说明:

在一场乒乓球比赛中,当且仅当一人分值高于11/21分且较另外一人高至少两分,结束比赛,即判胜。

题目解读

难点:

在输入格式中,我们特别的关注到:每行至多20个字母,也就是说,会有额外的换行符‘\n’输入。我们似乎无法解决这个问题,我们既不能使用二维数组通过for循环输入解决(未知输入几行),也似乎不能使用cin,scanf()这些会跳过空格和换行符的输入方式,于是,我们想到了使用getchar()进行一个伪数据判断。

算法描述

  1. 定义一个较长的字符数组,使用getchar()及伪数据判断接受全部的输入。
  2. 利用for循环遍历这个字符数组,遇到’W’华华得一分,遇到’L’对手得一分。
  3. 根据题意进行格式控制–当一局结束后(一次判胜)输出一次结果,当比赛结束(数组遍历结束)输出当前场次的结果。

代码实现

#include<iostream>
using namespace std;
char a[1000000];
int main()
{
    int i = 0;
    a[i] = getchar();//伪数据判断输入,利用getchar()不会因为换行和空格结束输出的特点,选择'E'
                     //作为输入结束的判定
    while (a[i] != 'E')
    {
        i++;
        a[i] = getchar();
    }
    int huahua = 0, duishou = 0;
    for (int j = 0; j < i; j++)//i记录的是不包括'E'的长度,E输入后并没有进行i++
    {
        if (a[j] == 'W')huahua++;
       else if(a[j]=='L')duishou++;
       //如果有判胜负则输出
        while (huahua >= 11 && huahua - duishou >= 2 || duishou >= 11 && duishou - huahua >= 2)
        {
            printf("%d:%d\n", huahua, duishou);
            huahua = 0, duishou = 0;
        }
    }
    //输出遍历结束后两人当前赛局并控制格式
    printf("%d:%d\n", huahua, duishou);
    printf("\n");
    huahua = 0, duishou = 0;
    for (int j = 0; j < i; j++)
    {
        if (a[j] == 'W')huahua++;
        else if(a[j]=='L')duishou++;
        while (huahua >= 21 && huahua - duishou >= 2 || duishou >= 21 && duishou - huahua >= 2)
        {
            printf("%d:%d\n", huahua, duishou);
            huahua = 0, duishou = 0;
        }
    }
    printf("%d:%d", huahua, duishou);
    return 0;
}

补充:伪数据判断/输入值判断

使用场景:

未知将要输入多少个数据,但是知道输入结束的标志符。注意,如果空格和换行都算作输入结束时,用一般的cin或者scanf()基本上都可以完成这个任务,这里的输入结束符应该是一个比较特殊的情况,如需要输入空格,以回车结束,或者是以题目给定的,例如本题’E’这种符号。

代码实现:

char a[100000],int i=0;
     a[i] = getchar();//利用输入值来判断是否停止输入,所以要先进行一次输入
    while (a[i] != 'E')
    {
        i++;
        a[i] = getchar();
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值