题解:AcWing 891 Nim游戏

【题目来源】

AcWing:891. Nim游戏 - AcWing题库

【题目描述】

给定 \(n\) 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。

问如果两人都采用最优策略,先手是否必胜。

【输入】

第一行包含整数 \(n\)

第二行包含 \(n\) 个数字,其中第 \(i\) 个数字表示第 \(i\) 堆石子的数量。

【输出】

如果先手方必胜,则输出 Yes

否则,输出 No

【输入样例】

2
2 3

【输出样例】

Yes

【算法标签】

《AcWing 891 Nim游戏》 #数学知识# #博弈论# #Nim游戏#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;           // 石子堆数
    cin >> n;
  
    int res = 0;     // 异或结果,初始为0
  
    // 读取每堆石子的数量
    while (n--)
    {
        int x;       // 当前堆的石子数量
        cin >> x;
        res ^= x;    // 将所有石子数量进行异或运算
    }
  
    // Nim博弈定理:
    // 如果所有石子数量的异或结果不为0,先手必胜
    // 如果所有石子数量的异或结果为0,先手必败
    if (res)  // 如果res != 0
    {
        cout << "Yes" << endl;  // 先手必胜
    }
    else
    {
        cout << "No" << endl;   // 先手必败
    }
  
    return 0;
}

【运行结果】

2
2 3
Yes
posted @ 2026-02-24 22:33  团爸讲算法  阅读(2)  评论(0)    收藏  举报