NOIP 2003普及组A-乒乓球

链接:https://ac.nowcoder.com/acm/contest/231/A
来源:牛客网
 

题目描述

国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中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

输入

复制

WWWWWWWWWWWWWWWWWWWW
WWLWE

输出

复制

11:0
11:0
1:1

21:0
2:1
#include<iostream>
#include<cmath>
using namespace std;
void work(string str,int score)
{
	int a=0,b=0;
	for(int i=0;i<str.size()&&str[i]!='E';i++)
	{
	if(str[i]=='W')
	a++;
	else b++;
	if(max(a,b)>=score&&abs(a-b)>=2)//两人中得分先到11分,并且分差不小于2
	{
		printf("%d:%d\n",a,b);
		a=0,b=0;//一局结束后归零
	}
   }
	printf("%d:%d\n",a,b); 
}

int main()
{
	string str,line;
	while(cin>>line)
	{
		
		str+=line;
        if(str.find('E')!=-1)//str中发现E结束循环
            break;
    }
		work(str,11);
		puts("");
		work(str,21);
		return 0;
	
	
}

 

<think>好的,我现在需要给用户介绍一下题目A,也就是NOIP2003普及组的“乒乓球”问题。首先,我得回忆一下这个题目的具体内容,可能涉及到的问题描述、输入输出格式以及解题思路。 首先,题目大意应该是关于乒乓球比赛的比分规则。根据NOIP的题目特点,这应该是一个模拟题,需要处理比赛结果的数据,然后输出正确的结果。可能涉及到的是根据给定的比赛记录,分别统计11分制和21分制下的比赛结果,比如每局比分,总局数等。 接下来,我需要确定用户的需求是什么。用户可能希望了解这个题目的背景、输入输出要求,以及如何解决这个问题。他们可能是一个刚开始学习编程的学生,或者正在准备NOIP竞赛,需要理解这个问题的解决思路。 那么,我应该先简要介绍题目背景,说明乒乓球比赛的两种赛制(11分制和21分制),然后详细描述输入输出的格式。例如,输入可能是一系列比赛的结果,用字符表示,比如'W'代表华华赢,'L'代表对手赢,'E'表示结束。输出则是分别按照两种赛制输出每局的比分,以及获胜的局数。 接下来需要考虑解题思路。这个问题应该如何处理输入数据?可能需要逐个字符读取,直到遇到'E'。然后,分别模拟两种赛制下的比赛过程。对于11分制和21分制,判断一局结束的条件是某一方达到11或21分,并且领先对方至少2分。否则需要继续比赛直到满足条件。 在具体实现上,可能需要两个函数或两个循环来处理两种赛制。对于每一分,需要更新当前局的比分,并检查是否满足结束条件。当一局结束后,将比分记录下来,并重置当前比分,开始下一局。最后,输出所有局的比分,以及可能未完成的当前局比分(如果有的话)。 需要注意的细节包括:输入可能有多行,直到遇到'E'为止;输入中可能包含除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 == 'W': a += 1 elif ch == 'L': 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. **输出格式** - 每局比分单独一行,两部分结果间需有空行。 --- 通过模拟比赛过程并严格判断胜负条件,即可高效解决此题。建议自行构造测试数据(如平分、险胜等场景)验证代码逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值