NOIP2003年普及组 T1 乒乓球

本文探讨了国际乒联主席沙拉拉推行的11分制改革引发的讨论,关注华华的研究案例,通过实际比赛数据展示两种制度对选手成绩的影响。你需要编写程序来模拟比赛结果并输出不同制度下的比分变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:这里

【题目描述】

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

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

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

WWWWWWWWWWWWWWWWWWWWWWLW

在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。直到分差大于或者等于2,才一局结束。

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

【输入格式】

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

【输出格式】

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

【样例输入】

WWWWWWWWWWWWWWWWWWWW
WWLWE
【样例输出】

11:0
11:0
1:1

21:0
2:1
【分析】

题目作为一道与乒乓球的题目有点难了。有几个坑需要说明。

乒乓球比赛规则,不论11分制还是21分制,分差大于2分才能赢。那么除了判断是否到达11分还是21分之外,还要判断分差大于2。(这一点中原题没有体现,上文题目描述最后一句是自己加的)。
“E”出现的位置,不一定在什么地方,有可能是开头,这样的结果就是0:0。
数组大小,这个题数组开到10000都不够。
【参考代码1】

// 2003 NOIP 1T 乒乓球
/*
11分制和21分制问题
w表示花花得1分,l表示对手得1分。
11分制:
WWWWWWWWWWW WWWWWWWWWWW LW
11:0
11: 0
1:1
21分制:
WWWWWWWWWWWWWWWWWWWWW WLW
21:0
2:1

*/
// 乒乓球
#include
#include
using namespace std;
int win[62503];
int w,l;
int main()
{
char s;
for(int i=1;cin>>s&&s!=‘E’;i++)//循环读入,当读到字符E结束
{
if(s==‘W’)win[i]=1;
else win[i]=2;
}
//----------------11分制 ----------------
for(int i=1;1;i++)
{
if(win[i]==1)w++;//胜场+1
if(win[i]==2)l++;//负场+1
if(win[i]==0)//读到0则记录结束,输出记录结束前的分数。
{
cout<<w<<":"<<l<<endl<<endl;
break;
}
if(w-l>=2||l-w>=2)
if(w>=11||l>=11)//当双方比分相差大于2且一方分数大等于11输出
{
cout<<w<<":"<<l<<endl;
w=0;//比分清零
l=0;
}
}
w=0;//清零,为21分制计算做准备
l=0;
//----------------21分制 ----------------
for(int i=1;1;i++)//一切同上,唯一区别就是判定从11变为21
{
if(win[i]==1)w++;
if(win[i]==2)l++;
if(win[i]==0)
{
cout<<w<<":"<<l;
break;
}
if(w-l>=2||l-w>=2)
if(w>=21||l>=21)//11变为21
{
cout<<w<<":"<<l<<endl;
w=0;
l=0;
}
}
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、付费专栏及课程。

余额充值