题意:跟前一道
Fibonacci again and again 差不多,对每种S只能取固定的数,下面有m组测试数据,每组开始一个l 表明有多少个数,接着输入l个hi,对于每组问先手是赢是输。
思路:一样的求SG函数,注意两点,第一,给出S所能取的数不一定是从小到大的,所以得排序;第二,按普通的求SG函数方法,会超时,无耐看也别人的方法才知道得用递归求SG。 还有一点不明白,他们为什么都把SG初始为-1,提交时,初始为-1比0要快!!!不解。
//1020K
297MS
#include
#include
#include
using namespace std;
const int N = 105;
const int M = 10005;
int Array[N],SG[M];
int GetSG(int num)
{
int hash[N],i,j;
if (SG[num])
return SG[num];
memset (hash,0,sizeof(hash));
for (j = 1; Array[j] <= num&&j<=Array[0]; j ++ )
hash[GetSG(num-Array[j])] = 1;
for (j = 0; ; j ++)
if (!hash[j])
return
SG[num]=j;
}
int main ()
{
int n,m,T,i;
while (~scanf ("%d",&T)&&T)
{
Array[0] = T;
for (i = 1; i <= T; i ++)
scanf ("%d",&Array[i]);
sort(Array+1,Array+T+1);
scanf ("%d",&m);
memset (SG,0,sizeof(SG));
while (m --)
{
scanf ("%d",&n);
int ans = 0;
int num;
for (i = 0; i < n; i ++)
{
scanf ("%d",&num);
ans ^= GetSG(num);
}
if (ans)
printf ("W");
else printf ("L");
}
printf ("\n");
}
return 0;
}
思路:一样的求SG函数,注意两点,第一,给出S所能取的数不一定是从小到大的,所以得排序;第二,按普通的求SG函数方法,会超时,无耐看也别人的方法才知道得用递归求SG。 还有一点不明白,他们为什么都把SG初始为-1,提交时,初始为-1比0要快!!!不解。
//1020K
#include
#include
#include
using namespace std;
const int N = 105;
const int M = 10005;
int Array[N],SG[M];
int GetSG(int num)
{
}
int main ()
{
}