POJ 2960 S-Nim
TLE TLE TLE WA AC
大意:有n堆石子,每堆石子个数已知,两人轮流从中取石子,
每次可取的石子数x满足x属于集合S(k) = {s1,s2,s3...sk-1},问先拿者是否有必胜策略?
算法:
注意:
#include<iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int NN=10010;
int q,l,n;
int take[NN],stone;
int SG[NN];
bool have[NN];
int _sg(int x)
{
if (x<0) return 0;
if (SG[x]!=-1) return SG[x];
for (int i=0;i<l;++i)
{
if (x>=take[i])
_sg(x-take[i]);
//if (x>=take[i])
//have[_sg(x-take[i])]=1;
else break;
}
memset(have,0,sizeof(have));
for (int i=0;i<l;++i)
{
if (x>=take[i])
have[SG[x-take[i]]]=1;
else break;
}
SG[x]=0;
while (have[SG[x]]) SG[x]++;
return SG[x];
}
int main()
{
while (scanf("%d",&l),l)
{
for (int i=0;i<l;++i) scanf("%d",&take[i]);
sort(take,take+l);
scanf("%d",&q);
memset(SG,-1,sizeof(SG));
while (q--)
{
scanf("%d",&n);
int p=0;
for (int i=0;i<n;++i)
{
scanf("%d",&stone);
p^=_sg(stone);
}
if (p==0) printf("L");
else printf("W");
}
printf("\n");
}
}