乒乓球

描述

国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中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分制下的结果,两部分之间由一个空行分隔。

坑点+吐槽

  1. 注意赛点,一方要赢的话不但得达到11分/21分,与对手的分差还得大于等于2。比如十一分制下,一旦打到10:10,那么一方就得连赢两球才能赢得比赛。起码得达到12:10才能分出胜负,而如果11:11了,就得打到13:11。
    吐槽:平时也对乒乓球,知道这个规矩,但是做题目的时候真的完全没有想到这个“潜规则”,吐血吐死了。这种题目里隐藏的规则好恶心。
  2. "如果一局比赛刚开始,则此时比分为0比0"这句话一直没看懂是什么意思,最后看了网上的解答才知道,原来最后循环结束后必须要输出当前比分,哪怕是一局比赛刚刚结束,也要输出个0:0来表示新的比赛刚开始。
    吐槽:吐血吐死了,我循环结束后还特地判断了一下,如果是0:0了就不要输出来了,难受。
  3. 还有一点蛮神奇的,我帮同学检查代码的时候发现的。就是最后他最后的输出是放在循环的最后一次输出的,然后就死活wrong answer(正常的话是循环结束后再输出),我想了好久,给他发消息的时候才茅塞顿开的想到,如果输入只有E的话,他的循环是进不去的。所以不行。吐血
  4. 推荐一下他的这个读取输入的方法:
    scanf("%[^E]", sentence);
    E之后的直接就不读了,很方便

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

char sentence[100000];

int main()
{
    scanf("%[^E]", sentence);
    int length = strlen(sentence);
    int player1 = 0, player2 = 0;
    for (int i = 0; i < length; i++)
    {
        if (sentence[i] == 'W')
            player1++;
        if (sentence[i] == 'L')
            player2++;
        
        if ((player1 >= 11 || player2 >= 11) && abs(player1 - player2) >= 2)
        {
            printf("%d:%d\n", player1, player2);
            player1 = 0; player2 = 0;
        }
        
    }
    printf("%d:%d\n", player1, player2);
    printf("\n");
    
    player1 = 0;
    player2 = 0;
    
    for (int i = 0; i < length; i++)
    {
        if (sentence[i] == 'W')
            player1++;
        if (sentence[i] == 'L')
            player2++;
        if ((player1 >= 21 || player2 >= 21) && abs(player1 - player2) >= 2)
        {
            printf("%d:%d\n", player1, player2);
            player1 = 0; player2 = 0;
        }
        
    }
    printf("%d:%d\n", player1, player2);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值