[NOIP2003 普及组] 乒乓球#洛谷

题目背景

国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 111111 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 111111 分制和 212121 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

题目描述

华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 111111 分制和 212121 分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录,(其中 W\texttt WW 表示华华获得一分,L\texttt LL 表示华华对手获得一分):

WWWWWWWWWWWWWWWWWWWWWWLW\texttt{WWWWWWWWWWWWWWWWWWWWWWLW}WWWWWWWWWWWWWWWWWWWWWWLW

111111 分制下,此时比赛的结果是华华第一局 111111000 获胜,第二局 111111000 获胜,正在进行第三局,当前比分 111111。而在 212121 分制下,此时比赛结果是华华第一局 212121000 获胜,正在进行第二局,比分 222111。如果一局比赛刚开始,则此时比分为 000000。直到分差大于或者等于 222,才一局结束。

你的程序就是要对于一系列比赛信息的输入(WL\texttt{WL}WL 形式),输出正确的结果。

输入格式

每个输入文件包含若干行字符串,字符串有大写的 W\texttt WWL\texttt LLE\texttt EE 组成。其中 E\texttt EE 表示比赛信息结束,程序应该忽略 E\texttt EE 之后的所有内容。

输出格式

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

样例 #1

样例输入 #1

WWWWWWWWWWWWWWWWWWWW
WWLWE

样例输出 #1

11:0
11:0
1:1

21:0
2:1

提示

每行至多 252525 个字母,最多有 250025002500 行。

(注:事实上有一个测试点有 250125012501 行数据。)

【题目来源】

NOIP 2003 普及组第一题

def work(mapp,key):
    global eleven_imgl,eleven_imgw,tw_imgl,tw_imgw
    key_tamp=True
    if key==21:
        key_tamp=False
    valuew=0
    valuel=0
    for item in range(len(mapp)):
        if valuel>=key-1 and valuew>=key-1:
            if abs(valuel-valuew)>=2:
                if key_tamp:
                    eleven_imgw.append(valuew)
                    eleven_imgl.append(valuel)
                    pass
                else:
                    tw_imgw.append(valuew)
                    tw_imgl.append(valuel)
                    pass
                valuel = 0
                valuew = 0
        else:
            if valuel == key or valuew == key:
                if key_tamp:
                    eleven_imgw.append(valuew)
                    eleven_imgl.append(valuel)
                    pass
                else:
                    tw_imgw.append(valuew)
                    tw_imgl.append(valuel)
                    pass
                valuel = 0
                valuew = 0
        if mapp[item]=='W':
            valuew+=1
            pass
        if mapp[item]=='L':
            valuel+=1
            pass
        if mapp[item]=='E':
            if key_tamp:
                eleven_imgw.append(valuew)
                eleven_imgl.append(valuel)
                pass
            else:
                tw_imgw.append(valuew)
                tw_imgl.append(valuel)
                pass
            break
if __name__=="__main__":
    flag=True
    img=[]
    eleven_imgw=[]
    eleven_imgl=[]
    tw_imgw = []
    tw_imgl = []
    while flag:
        data=input()
        for item in data:
            if item!='E':
               img.append(item)
               pass
            else:
                img.append(item)
                flag=False
                pass
            pass
        pass
    work(img,11)
    work(img,21)
    for item in range(len(eleven_imgl)):
        print("%d:%d"%(eleven_imgw[item],eleven_imgl[item]))
        pass
    print()
    for item in range(len(tw_imgl)):
        print("%d:%d"%(tw_imgw[item],tw_imgl[item]))

这里先介绍一下十一分制:
乒乓球十一分制,单局比赛先得11分者赢。
如果两人都得分超过达到10分后必须赢过对手2分才算赢。
如果没有这道题我可能永远不会去搜这个规则,确实平常也不打乒乓球。我认为题目应该介绍一下的。对应21分制就是如果超过20分则需要领先对方两分才能赢。模拟的题目只要把每个变量规定清晰然后有耐心去做就行。

<think>好的,我现在需要给用户介绍一下题目A,也就是NOIP2003普及组的“乒乓球”问题。首先,我得回忆一下这个题目的具体内容,可能涉及到的问题描述、输入输出格式以及解题思路。 首先,题目大意应该是关于乒乓球比赛的比分规则。根据NOIP的题目特点,这应该是一个模拟题,需要处理比赛结果的数据,然后输出正确的结果。可能涉及到的是根据给定的比赛记录,分别统计11分制和21分制下的比赛结果,比如每局比分,总局数等。 接下来,我需要确定用户的需求是什么。用户可能希望了解这个题目的背景、输入输出要求,以及如何解决这个问题。他们可能是一个刚开始学习编程的学生,或者正在准备NOIP竞赛,需要理解这个问题的解决思路。 那么,我应该先简要介绍题目背景,说明乒乓球比赛的两种赛制(11分制和21分制),然后详细描述输入输出的格式。例如,输入可能是一系列比赛的结果,用字符表示,比如&#39;W&#39;代表华华赢,&#39;L&#39;代表对手赢,&#39;E&#39;表示结束。输出则是分别按照两种赛制输出每局的比分,以及获胜的局数。 接下来需要考虑解题思路。这个问题应该如何处理输入数据?可能需要逐个字符读取,直到遇到&#39;E&#39;。然后,分别模拟两种赛制下的比赛过程。对于11分制和21分制,判断一局结束的条件是某一方达到11或21分,并且领先对方至少2分。否则需要继续比赛直到满足条件。 在具体实现上,可能需要两个函数或两个循环来处理两种赛制。对于每一分,需要更新当前局的比分,并检查是否满足结束条件。当一局结束后,将比分记录下来,并重置当前比分,开始下一局。最后,输出所有局的比分,以及可能未完成的当前局比分(如果有的话)。 需要注意的细节包括:输入可能有多行,直到遇到&#39;E&#39;为止;输入中可能包含除W、L、E之外的其他字符,需要忽略;在输出时,每局的结果以比分的形式呈现,比如21:19,每行一个结果,先输出11分制的结果,再输出21分制的。 可能的错误点包括:没有正确处理领先2分的条件,或者在处理输入时遗漏了某些字符。例如,当比分达到10:10时,必须继续比赛直到一方领先两分才能结束该局。 举个例子,假设输入的记录是WWWWWWWWWWWE,那么在11分制下,华华以11:0赢下一局,而在21分制下也是21:0赢一局。如果记录是WLWLLWLLWLWLWE,可能需要计算每个赛制下的比分情况。 总结步骤应该是:读取输入,处理两种赛制,模拟比赛过程,记录每局比分,最后按要求输出。需要分步骤讲解,确保用户理解每一步的逻辑。 可能用户还会关心如何测试自己的程序是否正确,可以建议他们用题目给出的样例输入,或者自己构造一些边界情况,比如刚好赢2分的情况,或者需要多局的情况。 最后,提醒用户注意代码实现的细节,比如字符处理的方式,循环终止条件,以及输出格式的正确性。</think>**题目 A. [NOIP2003 普及组] 乒乓球** 这是一道模拟题,要求根据乒乓球比赛的得分记录,分别按 **11 分制** 和 **21 分制** 的规则统计每局比分。 --- ### **题目背景** 乒乓球比赛的胜负规则如下: - 一局比赛中,先得 **11 分**(或 **21 分**)且领先对手至少 **2 分** 的一方获胜。 - 若比分达到 10:10(或 20:20),则需继续比赛,直到一方领先 2 分为止。 - 输入为一系列比赛记录(由 `W`、`L`、`E` 组成),需输出两种赛制下的每局比分。 --- ### **输入格式** - 输入包含若干行字符串,仅由 `W`(华华得分)、`L`(对手得分)、`E`(结束标志)组成。 - 所有字符需处理到 `E` 为止,`E` 之后的内容可忽略。 - 输入保证至少有一个有效比分。 **示例输入** ``` WWWWWWWWWWWE ``` --- ### **输出格式** 1. **第一部分**:按 11 分制输出所有局的比分,每局占一行,格式为 `华华得分:对手得分`。 2. **第二部分**:按 21 分制输出所有局的比分,格式同上。 3. 若未完成一局(即未满足获胜条件且未到 `E`),仍需输出当前比分。 **示例输出** ``` 11:0 21:0 ``` --- ### **解题思路** 1. **输入处理** - 读取所有字符直到遇到 `E`,过滤无效字符(如空格、换行)。 2. **模拟比赛过程** - 分别对 **11 分制** 和 **21 分制** 进行两次独立的模拟。 - 维护当前局的比分 `a`(华华得分)和 `b`(对手得分)。 3. **判断胜负条件** - 当一方得分 ≥11(或 21)且领先 ≥2 分时,记录该局比分并重置为 0:0。 - 若遇到 `E`,直接输出未完成的比分(即使未满足条件)。 --- ### **关键代码逻辑(伪代码)** ```python 读取所有字符,过滤后存入列表 s def simulate(rule): a, b = 0, 0 results = [] for ch in s: if ch == &#39;W&#39;: a += 1 elif ch == &#39;L&#39;: b += 1 # 检查是否满足结束条件 if (a >= rule or b >= rule) and abs(a - b) >= 2: results.append(f"{a}:{b}") a, b = 0, 0 # 处理未完成的局 if a != 0 or b != 0: results.append(f"{a}:{b}") return results 输出 11 分制的结果 输出空行 输出 21 分制的结果 ``` --- ### **注意事项** 1. **边界条件** - 比分可能为 10:12(11 分制无效,需继续比赛)或 20:22(21 分制有效)。 2. **输入处理** - 需正确处理多行输入,并过滤非 `W/L/E` 的字符。 3. **输出格式** - 每局比分单独一行,两部分结果间需有空行。 --- 通过模拟比赛过程并严格判断胜负条件,即可高效解决此题。建议自行构造测试数据(如平分、险胜等场景)验证代码逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

直接AC好吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值