zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Irrlicht入门教程,下载安装运行
    git 命令用法 流程操作
    summernote富文本编辑器的使用
    MVC进行多文件上传
    jQuery中的for循环var与let的区别
    识别图片中文字(百度AI)
    sublime安装 和 插件安装
    nopCommerce电子商务平台 安装教程(图文)
    springMVC 配置和使用
    mysql 一看就会 基本语法
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2464503.html
Copyright © 2011-2022 走看看