题目链接:https://loj.ac/problem/10247
解题思路
就是一般sg函数的运用,根据每次的s,推出当前情况的sg函数,然后异或,等于0,+“L”,不等于0,+“W”。
AC代码
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
int a[105],s[105];
int sg[10005];
bool vis[10005];
int n,m,k;
void get_sg()
{
sg[0]=0;
for(int i=1;i<=10000;++i)
{
memset(vis,0,sizeof(vis));
for(int j=1;j<=k;++j)
{
if(i-s[j]<0)
break;
vis[sg[i-s[j]]]=1;
}
int j=0;
while(vis[j])
{
j++;
}
sg[i]=j;
}
}
int main()
{
while(~scanf("%d",&k)&&k)
{
for(int i=1;i<=k;++i)
scanf("%d",&s[i]);
sort(s+1,s+1+k);
get_sg();
string ans;
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
int res=0;
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
res^=sg[a[i]];
}
if(res)
ans+="W";
else
ans+="L";
}
cout<<ans<<endl;
}
return 0;
}