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/
  • 相关阅读:
    logstash multiple piplines 配置方式
    filter-mutate过滤插件
    redis主从复制
    redis sentinel(哨兵)
    mongodb replica-set
    Linux入门篇(五)——Shell(一)
    Linux入门篇(四)——Vim的使用与Bash
    Linux入门篇(三)——文件与目录
    Linux入门篇(二)——文件
    Linux入门篇(一)——基本命令
  • 原文地址:https://www.cnblogs.com/cj695/p/2618215.html
Copyright © 2011-2022 走看看