1 条题解

  • 0
    @ 2026-4-6 12:01:18

    题目理解

    两个人 Alice 和 Bob 轮流操作,Alice 先手。
    初始:Alice 有 aa 个硬币,Bob 有 bb 个硬币。

    每回合操作顺序:

    1. 可以选择 交换钱包(即当前玩家与对手互换钱包),或者 不交换
    2. 自己当前持有的钱包 中取出 11 个硬币(取之前该钱包必须有至少 11 个硬币)。

    如果某回合无法执行第 2 步(即自己当前钱包为 00 且不能交换到非零钱包? 等等,但交换是在第 1 步自由选择的,所以真的会无法操作吗?)
    关键是:交换后如果自己新持有的钱包为 00,则依然无法取硬币,所以这回合就输了。
    因此,必须保证 第 2 步操作前当前钱包非零


    关键观察

    交换的作用是:

    • 当前玩家可以选择 从自己原本的钱包取 1,或者 从对手原本的钱包取 1(通过先交换,然后从交换后自己持有的钱包取 1)。

    所以无论选择哪种,每一回合都会从某个钱包中减少 1 个硬币,且总硬币数 a+ba+b 减少 1。


    终止条件

    游戏什么时候结束?
    当某玩家在回合开始时,两个钱包都为空,他就输了。
    为什么?因为第 1 步交换与否都不重要,交换后自己钱包还是 0,第 2 步无法取硬币。
    所以 游戏结束当且仅当 a=0a = 0b=0b = 0


    赢家判定

    设当前总硬币数为 S=a+bS = a + b
    每一回合 SS 减少 1,所以 SS 从初始值一直降到 00
    总回合数 = SS

    因为 Alice 先手,所以:

    • 如果 SS 是奇数,则最后一个操作(第 SS 回合)由 Alice 执行。
      SS 回合开始时,S=1S = 1(只剩 1 个硬币),她取走这最后一个硬币后,S=0S = 0,轮到 Bob 行动时无法操作,Bob 输,Alice 赢。
    • 如果 SS 是偶数,则最后一个操作由 Bob 执行,Bob 取走最后一个硬币后,S=0S = 0,轮到 Alice 行动时无法操作,Alice 输,Bob 赢。

    因此:

    • a+ba + b 为奇数 → Alice 赢
    • a+ba + b 为偶数 → Bob 赢

    验证样例

    我们拿样例验证:

    • 1,11,1a+b=2a+b=2 偶数 → Bob ✅
    • 1,41,4a+b=5a+b=5 奇数 → Alice ✅
    • 5,35,3a+b=8a+b=8 偶数 → Bob ✅
    • 4,54,5a+b=9a+b=9 奇数 → Alice ✅
    • 11,911,9a+b=20a+b=20 偶数 → 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";
            }
        }
    }
    

    复杂度分析

    每个测试用例 O(1)O(1),总复杂度 O(t)O(t),完美满足 t1000t \le 1000

    • 1

    信息

    ID
    6436
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者