题目大意:已知一次可拿个数的种类;求出先手是否胜利,若胜利输出W否则输出L;
SG函数模板:
#include<string.h>
const int N = 10008;
int a[110],sg[N],f[N];
void sgt(int *a,int y,int z)
{
int i,j;
memset(sg,0,sizeof(sg));
for(i=1;i<=z;i++)
{
memset(f,0,sizeof(f));
for(j=0;j<y;j++)
if(i-a[j]>=0)
f[sg[i-a[j]]] = 1;
for(j=0;j<=z;j++)
if(!f[j])
break;
sg[i]=j;
}
}
题目代码:
#include <cstdio>
#include<string.h>
const int N = 10008;
int a[110],sg[N],f[N];/*N求解范围a[]数组是可以每次取的值,f[]存储是否应经出现(用于mex{}函数)*/
void sgt(int *a,int y,int z)
{
int i,j;
memset(sg,0,sizeof(sg));
for(i=1;i<=z;i++)
{
memset(f,0,sizeof(f));
for(j=0;j<y;j++)
if(i-a[j]>=0)
f[sg[i-a[j]]] = 1;
for(j=0;j<=z;j++)//mex{}部分
if(!f[j])
break;
sg[i]=j;
}
}
int main()
{
int kase;
while(scanf("%d",&kase)!=EOF&&kase)
{
char out[110];//最后一起输出结果,存在out数组里
strcpy(out,"");
memset(a,0,sizeof(a));
for(int i=0;i<kase;i++)
{
scanf("%d",&a[i]);
}
sgt(a,kase,N);
int m;
scanf("%d",&m);
while(m--)
{
int l,result=0;
scanf("%d",&l);
while(l--)
{
int h;
scanf("%d",&h);
result=result^sg[h];
}
if(result) strcat(out,"W");
else strcat(out,"L");
}
printf("%s\n",out);
}
return 0;
}