题目
传送门
大意:
首先输入K 表示一个集合的大小 之后输入集合 表示每次可以取多少个石子
之后输入 一个m 表示接下来对于这个集合要进行m次询问
之后m行 每行输入一个n 表示有n个堆 每堆有n1个石子 问这一行所表示的状态是赢还是输 如果赢输入W否则L
题解
思路:对于n堆石子 可以分成n个游戏 之后把n个游戏合起来就好了
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,p,x,f[1001],sg[10001];
int SG_dfs(int x)
{
if (sg[x]!=-1) return sg[x];
bool vis[101];//这个bool数组只能在函数内定义,否则就会出错,为什么?
memset(vis,0,sizeof(vis));
for (int i=0; i<n; i++)
{
if (x>=f[i])
{
SG_dfs(x-f[i]);
vis[sg[x-f[i]]]=1;
}
}
int i=0;
while (1)
{
if (!vis[i]) return sg[x]=i;
i++;
}
}
int main()
{
while (scanf("%d",&n) && n)
{
memset(sg,-1,sizeof(sg));//注意应该在这里清零
for (int i=0; i<n; i++) scanf("%d",&f[i]);
sort(f,f+n);
scanf("%d",&m);
for (int i=1; i<=m; i++)
{
scanf("%d",&p);
int ans=0;
for (int j=1; j<=p; j++)
{
scanf("%d",&x);
ans^=SG_dfs(x);
}
if (ans==0) printf("L");
else printf("W");
}
printf("\n");
}
}
总结
memset清零的位置要注意;
还有定义vis的玄学错误;