书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!

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;
    }
}

 

posted on 2012-08-16 15:59  More study needed.  阅读(360)  评论(0编辑  收藏  举报

导航

书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!