【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=2176
【算法】
Nim博弈
当石子数异或和不为0时,先手必胜,否则先手必败
设石子异或和为S
如果S xor ai <= ai,那么,第一步就可以从第i堆石子中取走(S xor ai)个石子
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXM 200010 int i,m,k,sum; int a[MAXM]; int main() { while (scanf("%d",&m) && m) { sum = 0; for (i = 1; i <= m; i++) { scanf("%d",&a[i]); sum ^= a[i]; } if (sum != 0) { printf("Yes\n"); for (i = 20; i >= 0; i--) { if (sum & (1 << i)) { k = i; break; } } for (i = 1; i <= m; i++) { if ((sum ^ a[i]) <= a[i]) printf("%d %d\n",a[i],sum^a[i]); } } else printf("No\n"); } return 0; }
本文深入探讨了Nim博弈的基本策略,阐述了当石子数异或和不为0时,先手玩家如何确保胜利的方法。通过具体算法实现,详细解释了如何在每一步选择最优策略,以达到游戏目标。
3709

被折叠的 条评论
为什么被折叠?



