78题台阶Nim游戏是吗?

摘要:78.Acwing基础课第892题-简单-台阶-Nim游戏 题目描述 (现在,有一个 n 级台阶的楼梯,每级台阶上都有若干个石子,其中第 i 级台阶上有 a_i 个石子(i≥1))。 (两位玩家轮流操作,每次操作可以从任意一级台阶上拿
78.Acwing基础课第892题-简单-台阶-Nim游戏 题目描述 \(现在,有一个 n 级台阶的楼梯,每级台阶上都有若干个石子,其中第 i 级台阶上有 a_i 个石子(i≥1)\)。 \(两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)\)。 \(已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败\)。 \(问如果两人都采用最优策略,先手是否必胜\)。 输入格式 \(第一行包含整数 n\)。 \(第二行包含 n 个整数,其中第 i 个整数表示第 i 级台阶上的石子数 a_i\)。 输出格式 如果先手方必胜,则输出 Yes。 否则,输出 No。 数据范围 \(1≤n≤10^5\), \(1≤a_i≤10^9\) 输入样例: 3 2 1 3 输出样例: Yes 代码: // 包含基础输入输出、算法头文件 #include <iostream> #include <algorithm> using namespace std; // 常量定义:N=100010,适配输入数据的最大规模(支持n≤1e5) const int N = 100010; int main() { int n; // n:游戏中堆的总数(堆按1~n顺序编号) scanf("%d", &n); // 输入堆的数量 int res = 0; // 存储奇数位置堆的异或结果(核心判断值) // 遍历每一堆(i为堆的编号,从1开始) for (int i = 1; i <= n; i ++ ) { int x; // x:当前堆的石子数量 scanf("%d", &x); // 输入当前堆的石子数 // i & 1:判断堆的编号是否为奇数(等价于i%2==1) // 仅对奇数位置的堆做异或累积(偶数位置堆不参与判断) if (i & 1) res ^= x; } // 胜负判断规则(同尼姆游戏,但仅基于奇数堆的异或和): // res≠0 → 先手有必胜策略(输出Yes) // res=0 → 先手必败(输出No) if (res) puts("Yes"); else puts("No"); return 0; }