1 条题解
-
0
题目「A. The Play Never Ends」详细题解
问题重述
有三个玩家:Sosai、Fofo 和 Hohai。他们进行无限场乒乓球比赛,规则如下:
- 每场比赛有 人比赛, 人观战。
- 规则 1:没有选手可以连续打三场比赛。
- 规则 2:如果一个选手连续打了两场比赛,那么他下一场必须观战(由另外两人比赛)。
- 规则 3:否则(即没有人连续打两场),下一场比赛的参赛者是 上一场的胜者 和 上一场的观众,上一场的败者观战。
给定一个整数 ,判断第一场比赛的观众是否可能成为第 场比赛的观众。
问题本质
这是一个状态转移 + 可到达性问题。
由于规则确定,但第一场比赛的结果(胜者)可以任意选择(因为我们要问“是否可能”),所以我们只需要判断:是否存在一种比赛结果序列,使得第 场观众等于第 场观众。
状态定义
用三元组 表示状态:
- :当前观众
- :当前胜者
- :当前败者
由于只有 个人, 可由 和 唯一确定:
所以状态可简化为 。
初始状态
第一场比赛:
- 观众记为
- 胜者记为
- 败者记为
初始状态:
状态转移分析
根据规则,转移取决于当前胜者 是否连续两场获胜。
我们需要知道上一场的胜者,所以状态必须包含历史信息。
实际上更简单的做法是手动枚举小 的可达观众。
手动推导(关键)
设第 场观众为 ,胜者为 ,败者为 。
第 场
- 观众:
第 场
胜者 只打了一场,所以规则 3 适用。
下一场参赛者 = 胜者 + 观众 ,败者 观战。
所以第 场观众 = 。
结论:第 场观众一定不是 。第 场
分两种情况:
情况 1:第 场胜者是
那么第 场胜者 连续打了第 场和第 场 → 规则 2 适用:第 场观众 = (因为 连打两场后必须观战)
此时第 场观众 = ✅情况 2:第 场胜者是
那么第 场胜者 连续打了第 场和第 场 → 规则 2 适用:第 场观众 =
此时第 场观众 = ❌()结论:第 场观众可能是 (当第 场 赢时),也可能不是。
第 场及以后
继续推导会发现模式。
实际上,通过枚举或编写程序模拟,可以得到以下观众可达性表(假设初始观众为 ):是否可以等于 ✅ YES ❌ NO ✅ YES(可以) ❌ NO ✅ YES ❌ NO ✅ YES ...
规律总结
观察发现:
- 当 (奇数)时,似乎可以?
- 但 可以, 可以, 可以...
检查示例:
- :✅()
- :❌()
- :,示例输出 NO
- :(因为 能被 整除),示例输出 YES
所以规律是:
第 场观众可以是第 场观众,当且仅当
证明思路(简要)
- 定义 为第 场观众相对于初始观众 的可能性。
- 通过状态转移图可证,观众序列的周期为 :
- :可以等于
- :一定不是
- :一定不是
- 严格的数学归纳:
- 基础: 成立
- 假设对于所有 成立,证明 时成立
- 由转移规则可知, 场观众与 场观众相同(在适当时机选择胜负)
标程代码分析
标程非常简洁:
if (k % 3 == 1) cout << "Yes\n"; else cout << "No\n";这直接实现了上述规律。
示例验证
输出 示例输出 YES YES ✅ NO NO ✅ YES YES ✅
时间复杂度
每个测试用例 ,总复杂度 ,完美处理 和 。
总结
本题的核心是:
- 手动推导 / 模拟 找出规律
- 发现观众可达性以 为周期
- 结论: 时 YES,否则 NO
属于找规律 + 模运算的简单数论题。
- 1
信息
- ID
- 7149
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者