zoukankan      html  css  js  c++  java
  • hdu1536博弈论sg函数

    用sg函数对每组数据中所有的数处理。。得到的结果异或。为0必输。。否则必胜

    #include<iostream>
    //#include<algorithm>
    #include<set>
    #include<cstdio>
    using namespace std;
    //const int MAXK=102;
    const int MAXM=102;
    //const int MAXL=102;
    const int MAXH=10002;
    set<int>de;
    int dp[MAXH];
    inline int sg(int cur)
    {
        if(dp[cur]!=-1)
        {
            return dp[cur];
        }
        int i;
        set<int>::const_iterator cp;
        bool visited[MAXM];
        memset(visited,0,sizeof(visited));
        if(cur==0)
        {
            return dp[cur]=0;
        }
        bool tag=0;
        for(cp=de.begin();cp!=de.end();cp++)
        {
            if(cur-*cp>=0)
            {
                int r;
                if(dp[cur-(*cp)]!=-1)
                {
                    r=dp[cur-(*cp)];
                }else
                {
                    r=sg(cur-(*cp));
                }
                if(r==0)
                {
                    tag=1;
                }
                //cout<<r<<" ";
                visited[r]=1;
            }else
            {
                break;
            }
        }
        i=0;
        int mex;
        if(tag)
        {
            int j=0;
            while(visited[j])
            {
                j++;
            }
            return dp[cur]=j;
        }else
        {
            return dp[cur]=0;
        }
    }
    int main()
    {
        int k;
        while(scanf("%d",&k)!=EOF)
        {
            memset(dp,-1,sizeof(dp));
            de.clear();
            if(k==0)
            {
                break;
            }
            int i;
            for(i=0;i<=k-1;i++)
            {
                int s;
                scanf("%d",&s);
                de.insert(s);
            }
            int m;
            scanf("%d",&m);
            bool result[MAXM];
            /*for(i=0;i<=10000;i++)
            {
                sg(i);
            }*/
            for(i=0;i<=m-1;i++)
            {
                int l;
                scanf("%d",&l);
                int j=0;
                int sum=0;
                for(j=0;j<=l-1;j++)
                {
                    int heap;
                    scanf("%d",&heap);
                    sum=sum^sg(heap);
                }
                if(sum)
                {
                    result[i]=1;
                }else
                {
                    result[i]=0;
                }
    
            }
            for(i=0;i<=m-1;i++)
            {
                if(result[i])
                {
                    printf("W");
                }else
                {
                    printf("L");
                }
            }
            printf("\n");
        }
        return 0;
    }
    

      

    本博客(http://www.cnblogs.com/cj695/)未标明转载的内容均为本站原创,非商业用途转载时请署名(77695)并注明来源(http://www.cnblogs.com/cj695/)。商业用途请联系作者(77695) QQ:646710030。作者(77695)保留本博客所有内容的一切权利。
    独立博客:http://nfeng.cc/
  • 相关阅读:
    查看Eclipse的版本
    eclipse3.7.1加载swt失败(转载)
    [转载]android的常用开发包
    JSP 两种注释的区别,代码段
    Delphi TAdvStringGrid 在表格显示出下拉列表
    Delphi TAdvStringGrid的回车换格功能
    Delphi TAdvStringGrid表格录入汉字总是给省略两个字的原因。
    Mac 终端命令大全
    Mac OS 下三种修改Hosts文件的方法
    Memcached与Memcache区别
  • 原文地址:https://www.cnblogs.com/cj695/p/2618215.html
Copyright © 2011-2022 走看看