博弈SG函数
题意:
首先输入一个k,输入k个可以取的值。
然后输入一个m,m组数据,接下来m行,每行一个num,指num堆石头,之后是num堆石头每堆石头的个数,必输输出L,反之输出W
因为每堆石头个数是1<=hi<=10000,所以在输入可以取的值后我们把1-10000的SG值打表,之后就是类似nim博弈了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=10005;
int SG[N];
int s[105];
bool vis[N];
int main()
{
int k;
while(~scanf("%d",&k)&&k)
{
for(int i=0; i<k; i++)
scanf("%d",&s[i]);
sort(s,s+k);
memset(SG,0,sizeof(SG));
for(int i=1; i<N; i++)///这是N因为石头的范围
{
memset(vis,0,sizeof(vis));
for(int j=0; s[j]<=i&&j<k; j++)///s只有0-k第一次这写错了
{
vis[SG[i-s[j]]]=1;
}
for(int j=0;;j++)
{
if(!vis[j])
{
SG[i]=j;
break;
}
}
}
int t,n,x;
scanf("%d",&t);
for(int cas=0; cas<t; cas++)
{
scanf("%d",&n);
int ans=0;
for(int i=0; i<n; i++)
{
scanf("%d",&x);
ans^=SG[x];
}
if(ans==0)
printf("L");
else
printf("W");
}
printf("\n");
}
return 0;
}