Nim游戏77题,简单版,怎么玩?

摘要:77.Acwing基础课第891题-简单-Nim游戏 题目描述 (给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败)。 (问如果两人都采用最优策略
77.Acwing基础课第891题-简单-Nim游戏 题目描述 \(给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败\)。 \(问如果两人都采用最优策略,先手是否必胜\)。 输入格式 \(第一行包含整数 n\)。 \(第二行包含 n 个数字,其中第 i 个数字表示第 i 堆石子的数量\)。 输出格式 如果先手方必胜,则输出 Yes。 否则,输出 No。 数据范围 \(1≤n≤10^5\), \(1≤每堆石子数≤10^9\) 输入样例: 2 2 3 输出样例: Yes 代码: // 包含基础输入输出、算法头文件 #include <iostream> #include <algorithm> using namespace std; // 常量定义:N=100010,适配输入数据的最大规模(本题未直接使用,预留扩展) const int N = 100010; int main() { int n; // n:游戏中堆的数量(或参与异或的数字个数) scanf("%d", &n); // 输入堆数 int res = 0; // 存储所有数的异或结果(尼姆游戏的核心判断值) // 遍历每一堆(或每个数字) while (n -- ) { int x; // x:当前堆的石子数量(或参与异或的数字) scanf("%d", &x); // 输入当前堆的石子数 res ^= x; // 异或累积:res = res ^ x(异或的结合律不影响最终结果) } // 尼姆游戏胜负判断: // res≠0 → 先手有必胜策略(输出Yes) // res=0 → 先手必败(输出No) if (res) puts("Yes"); else puts("No"); return 0; }