HDU 1536 SG函数应用

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536

只要构造好SG函数就行:AC代码:

#include<iostream>
using namespace std;
#include<string.h>
int a[110],k;  //k为全局变量
int sg[10010],flag[110];
void SG() //SG函数
{
    
    int i,j;
    for(i=0;i<=10000;i++)
    {
        memset(flag,0,sizeof(flag));
        for(j=0;j<k;j++)
         if(i>=a[j])
         flag[sg[i-a[j]]]=1;
         
         for(j=0;;j++) //采用筛选法
          if(flag[j]==0)
          {    
          sg[i]=j;
          break;
          }
    }
}
int main()
{
    int i,l,m,num;
    //freopen("d:\\1.txt","r",stdin);
    while(scanf("%d",&k)!=EOF&&k)
    {
        for(i=0;i<k;i++)
         cin>>a[i];
         SG(); //调用SG函数
        cin>>m;
        while(m--)
        {
            int s=0;
            cin>>l;
            while(l--)
            {
                cin>>num;
                s=s^sg[num];
            }
            if(s)cout<<"W";
            else
            cout<<"L";
        } 
        cout<<endl;
    }
    
    return 0;
}

 

一开始无限WA,还没找到错在哪,就是构造sg函数稍微不同,测试数据和上面的一样,SG函数数据也一样,但一直没AC,有哪位大牛看到错误帮忙指点错在哪,未AC代码如下:

#include<iostream>
using namespace std;
#include<algorithm>
#include<string.h>
#define M 10010
int a[110],b[110],d[110];
int c[M];
void fun(int a[],int k) //构造 Sprague-Grundy函数
{
    int i,j,m,k1;
    memset(c,0,sizeof(c));//对c数组进行清零
    sort(a,a+k);//将其排序
    for(i=1;i<=10000;i++)
    {
        k1=0;    
        memset(d,0,sizeof(d));    
        if(i<a[0])
        {
         c[i]=0;
         continue;
        }
        for(j=0;j<k;j++)
        if(i<a[j])break;
        for(m=0;m<j;m++)
            d[k1++]=c[i-a[m]];
        sort(d,d+k1);//将其排序
        for(m=0;;m++)
            if(m!=d[m])
            {
             c[i]=m;
             break;
            }    
    }    
}
int main()
{
    int m,i,k;
    //freopen("d:\\1.txt","r",stdin);
    while(~scanf("%d",&k)&&k)
    {
        int l,s;
        for(i=0;i<k;i++)
        cin>>a[i];
        
        fun(a,k);
        /*for(i=0;i<10000;i++)
         printf("%d ",c[i]);
         printf("\n");
         getch();*/
        cin>>m;
        while(m--)
        {
            s=0;
            cin>>l;
            for(i=0;i<l;i++)
            {
             cin>>b[i];
             s=s^c[b[i]];
            }
            if(s)cout<<"W";
            else
            cout<<"L";
        }
        printf("\n");
    }
    
    return 0;
}

 

posted @ 2012-04-21 23:49  龙杉老师  阅读(275)  评论(0编辑  收藏  举报