博弈论。
先求出一堆石子有x个的时候,sg值是多少:即他所有后继状态的mex值。
每一堆的sg值异或起来等于0就先手必败。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
int n,m,sg[1005],a[15],b[15],v[15],ans;
void Getsg()
{
for (int i=1;i<=1000;i++)
{
memset(v,0,sizeof(v));
for (int j=1;j<=m;j++)
if (i-b[j]>=0) v[sg[i-b[j]]]=1;
for (int j=0;j<=10;j++)
if (!v[j])
{
sg[i]=j;
break;
}
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for (int i=1;i<=m;i++)
scanf("%d",&b[i]);
Getsg();
int ans=0;
for (int i=1;i<=n;i++)
ans^=sg[a[i]];
if (!ans)
{
printf("No\n");
return 0;
}
printf("Yes\n");
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (sg[a[i]-b[j]]==(ans^sg[a[i]]))
{
printf("%d %d\n",i,b[j]);
return 0;
}
return 0;
}
感悟:
wa是因为输出格式。。(Yes写成YES..)
【BZOJ 1874】 [BeiJing2009 WinterCamp]取石子游戏
原文地址:http://blog.csdn.net/regina8023/article/details/42592711