现在的位置: 首页 > 综合 > 正文

poj 2960 S-Nim(博奕)

2018年03月17日 ⁄ 综合 ⁄ 共 1035字 ⁄ 字号 评论关闭
题意:跟前一道 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");
       

抱歉!评论已关闭.