洛谷 P1042 [NOIP2003 普及组] 乒乓球 题解 C/C++

思路如下

1.模拟打乒乓球:11分制:甲得分率先到达11分,且此时与乙的得分之差大于等于2,则甲获胜,一局结束,双方比分清零;否则继续比赛,直到双方比分只差大于等于2,得分多的一方获胜;总之就是:((甲得分>=11 || 乙得分>=11)&&abs(甲得分 – 乙得分)>=2 时一局结束,输出比分即可,同时双方比分清零。21分制同理;

2.边输入边统计即可,因为要输出完11分制结果在输出21分制,所以用数组暂存21分制比分,最后输出。

//P1042 [NOIP2003 普及组] 乒乓球
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <sstream>
#define inf 0x3f3f3f3f
#define eps 1e-6
using namespace std;
#define clr(x) memset(x,0,sizeof((x)))
const int maxn = 1e4+1;//2e6+1
#define M
<think>好的,用户想查询关于NOIP乒乓球题目,特别是题解或者题目本身的信息。我需要先回忆一下相关的NOIP题目。记得NOIP2003普及组有一道关于乒乓球的题目,应该是P1042。现在需要确认题目的具体内容和题解方法。 首先,根据用户提供的引用,题目的核心是处理乒乓球比赛的得分规则,11分制和21分制下的比赛结果。用户提供的三个引用都提到了这个规则,即当一方达到11或21分,并且分差≥2时,一局结束。否则继续比赛直到满足条件。这应该是题目的关键点。 接下来,我需要整理题目的要求。题目大概是输入一系列比赛记录,然后分别输出在11分制和21分制下每局的结果。例如,输入可能是一串字符,每个字符代表一球的胜负,需要按两种赛制分情况处理。 然后,用户需要题解的方法。根据引用中的描述,模拟比赛过程是关键。需要遍历每个球的胜负,累计双方的得分,当满足结束条件时记录当前比分,并清零进入下一局。需要注意的是,可能最后一局没有结束的情况是否需要处理,比如输入结束时比赛还在进行中,这时候不管比分是否满足条件都要输出当前的比分。 可能需要注意的细节包括:输入数据的处理,比如如何读取多行输入直到EOF;如何处理'W'、'L'、'E'等字符;如何分情况处理11分制和21分制;如何判断一局结束的条件等。 此外,用户提供的引用中有提到具体的代码实现,比如用C++或Python。可能需要考虑如何高效地遍历输入,维护当前得分,并在满足条件时重置得分。例如,可以分别写两个函数处理不同的赛制,或者用循环结构来复用代码。 现在,用户的问题是关于NOIP乒乓球题解或题目,所以需要给出题目的概述和解题思路,以及可能的实现方法。同时,根据用户的要求,生成相关问题,比如如何处理输入、边界条件是什么、优化方法等。 最后,确保回答符合系统级指令,使用正确的中文和LaTeX格式,引用对应的参考资料,并生成相关问题。</think>关于NOIP中的乒乓球题目,最经典的是**NOIP2003普及组T1《乒乓球》**[^2]。这道题考察对乒乓球比赛规则的模拟能力,需根据给定比赛记录,分别计算11分制和21分制下的每局比分。 ### 题目核心规则 1. **11分制** - 当任意一方得分≥11分 **且** 分差≥2时,该局结束 - 判断条件:$(score\_A \geq 11 \lor score\_B \geq 11) \land |score\_A - score\_B| \geq 2$[^3] 2. **21分制** - 条件类似,将11分改为21分:$(score\_A \geq 21 \lor score\_B \geq 21) \land |score\_A - score\_B| \geq 2$ ### 解题思路 1. **输入处理** 读取连续的`W`(赢球)、`L`(输球)字符序列,遇到`E`或文件结束符停止 2. **双模式处理** 分别用相同逻辑处理11分制和21分制: ```python def calculate(scores, rule): a = b = 0 result = [] for c in scores: if c == 'W': a += 1 elif c == 'L': b += 1 if (a >= rule or b >= rule) and abs(a - b) >= 2: result.append(f"{a}:{b}") a = b = 0 if a != 0 or b != 0: # 处理未完成的最后一局 result.append(f"{a}:{b}") return result ``` 3. **输出要求** 对每个测试用例输出两组结果,每组结果包含若干行比分 ### 易错点分析 - 需要处理最后一局未达到结束条件的情况(如输入突然中断) - 注意分差计算的绝对值判断 - 遇到`E`字符后立即停止处理[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值