大致思路:
这道题就是典型的讲解中提到的“每次取石子的数量是不连续的”,那么就用模板——打表法。
就是模板题。
代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int S[105];
int sg[105];
const int maxc=10005;
int vis[maxc];
int n;
void getsg() //打表法
{
for(int i=1;i<=maxc;i++) //对于石子数为1 2 3...maxc的一堆石子,sg值分别是多少
{
memset(vis,0,sizeof(vis));
for(int j=1;S[j]<=i&&j<=n ;j++)
{
vis[sg[i-S[j]]]=1; //后续
}
for(int k=0;k<=maxc;k++)
{
if(vis[k]==0)
{
sg[i]=k;
break; //之前一直卡,发现错因在忘了写break T T
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&S[i]);
}
sort(S+1,S+n+1);
getsg();
int m;
cin>>m;
while(m--)
{
int d;
scanf("%d",&d);
int ans=0;
for(int i=1;i<=d;i++)
{
int c;
scanf("%d",&c);
ans^=sg[c];
}
if(ans==0)
cout<<"L";
else
cout<<"W";
}
return 0;
}