题目概述
有
n
个硬币,每次可以先把一个正面朝上的硬币
解题报告
感觉思考博弈论题目好似智障,开始打代码时好似神仙。
有一个关键结论:若某个 Nim 游戏局面中出现石子数一样的两个石子堆,则去掉这两个石子堆后新局面与原局面等价。证明非常简单:假设 ai=aj ,则 ai xor aj=0 ,所以对局面没有影响。
那么这道题可以把每个正面朝上的硬币
i
看做石子数为
示例程序
#include<cstdio>
using namespace std;
const int maxn=10000;
int n,nim;
#define Eoln(x) ((x)==10||(x)==13||(x)==EOF)
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
scanf("%d",&n);char ch=getchar();while (Eoln(ch)) ch=getchar();
for (int i=1;i<=n;i++,ch=getchar()) if (ch=='H') nim^=i;
return printf("%s\n",nim?"Alice":"Bob"),0;
}