1 条题解
-
0
题目理解
两个人 Alice 和 Bob 轮流操作,Alice 先手。
初始:Alice 有 个硬币,Bob 有 个硬币。每回合操作顺序:
- 可以选择 交换钱包(即当前玩家与对手互换钱包),或者 不交换。
- 从 自己当前持有的钱包 中取出 个硬币(取之前该钱包必须有至少 个硬币)。
如果某回合无法执行第 2 步(即自己当前钱包为 且不能交换到非零钱包? 等等,但交换是在第 1 步自由选择的,所以真的会无法操作吗?)
关键是:交换后如果自己新持有的钱包为 ,则依然无法取硬币,所以这回合就输了。
因此,必须保证 第 2 步操作前当前钱包非零。
关键观察
交换的作用是:
- 当前玩家可以选择 从自己原本的钱包取 1,或者 从对手原本的钱包取 1(通过先交换,然后从交换后自己持有的钱包取 1)。
所以无论选择哪种,每一回合都会从某个钱包中减少 1 个硬币,且总硬币数 减少 1。
终止条件
游戏什么时候结束?
当某玩家在回合开始时,两个钱包都为空,他就输了。
为什么?因为第 1 步交换与否都不重要,交换后自己钱包还是 0,第 2 步无法取硬币。
所以 游戏结束当且仅当 且 。
赢家判定
设当前总硬币数为 。
每一回合 减少 1,所以 从初始值一直降到 。
总回合数 = 。因为 Alice 先手,所以:
- 如果 是奇数,则最后一个操作(第 回合)由 Alice 执行。
第 回合开始时,(只剩 1 个硬币),她取走这最后一个硬币后,,轮到 Bob 行动时无法操作,Bob 输,Alice 赢。 - 如果 是偶数,则最后一个操作由 Bob 执行,Bob 取走最后一个硬币后,,轮到 Alice 行动时无法操作,Alice 输,Bob 赢。
因此:
- 若 为奇数 → Alice 赢
- 若 为偶数 → Bob 赢
验证样例
我们拿样例验证:
- : 偶数 → Bob ✅
- : 奇数 → Alice ✅
- : 偶数 → Bob ✅
- : 奇数 → Alice ✅
- : 偶数 → Bob ✅
完全符合输出。
最终题解公式
胜者判定:
$$\text{winner} = \begin{cases} \text{Alice} & \text{if } (a + b) \bmod 2 = 1 \\ \text{Bob} & \text{if } (a + b) \bmod 2 = 0 \end{cases} $$
C++ 代码实现(与标程一致)
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int a, b; cin >> a >> b; if ((a + b) % 2 == 0) { cout << "Bob\n"; } else { cout << "Alice\n"; } } }
复杂度分析
每个测试用例 ,总复杂度 ,完美满足 。
- 1
信息
- ID
- 6436
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者