sg函数

hdu 1536 http://acm.hdu.edu.cn/showproblem.php?pid=1536

1.首先,mex的介绍:
mex运算
这是一个集合的运算,表示最小的不属于这个集合的非负整数。
例如mex{0,1,2,3}=4;
     mex{0,1,3,4}=2;
     mex{1,2,3,5}=?

2.然后,sg函数的定义和性质:
sg函数
sg函数的定义如下:
g(x)=mex{g(y) | y是x的后继}
很明显这是一个递归运算。 

sg函数的性质了:
如果g(x)=0 那么 x 位置就是必败点。
如果g(x)>0 那么 x 位置就是必胜点。
View Code
#include "iostream"
#include "string"
#include "algorithm"
using namespace std;
int k, a[105], f[10005];
int mex(int x)
{
    int i, t;
    bool mit[105]={0};
    //g(x)=mex{g(y) | y是x的后继}
    for(i=0; i<k; i++) //枚举可取方案
    {
        t = x-a[i];//x-a[i]就是x的后继
        if(t<0) break;//要求非负,所以break
        if(f[t]==-1)//后继仍然存在,继续找 
        {
            f[t] = mex(t);
        }
        mit[f[t]] = 1;//集合中存在f[t]这个值,标记一下
    }
    for(i=0; ; i++)
    {
        if(0==mit[i]) return i;
    }
}
int main()
{
    int n, i, m, t, s;
    while(cin>>k && k)
    {
        for(i=0; i<k; i++) cin>>a[i];
        sort(a, a+k);
        memset(f, -1, sizeof(f));
        f[0] = 0;
        cin>>n;
        while(n--)
        {
            cin>>m;
            s = 0;
            while(m--)
            {
                cin>>t;
                if(f[t]==-1) f[t] = mex(t);//得出当前的状态
                s = s^f[t];//nim-sum游戏
            }
            if(s==0) cout<<"L";
            else cout<<"W";
        }
        cout<<endl;
    }
}

 

转载于:https://www.cnblogs.com/o8le/archive/2012/08/16/2642505.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值