首页 > 代码库 > hdu 2999 Stone Game, Why are you always there? (简单SG,有个优化)

hdu 2999 Stone Game, Why are you always there? (简单SG,有个优化)

题意:

一排石头,个数是K。

有n个数,a1...an。

每人每次取石子只能取连续的x个。x属于a1...an的一个。

没法取者负。

 

思路:

简单的SG。但是TLE!后面加了一个优化~这个优化不好想到吧,看了别人的代码才发现的。就是把a1...an中重复的去掉!。。。

直接看代码。

 

代码:

int sg[1005];int n,m,k;int a[105];int dfs(int x){    if(sg[x]!=-1)        return sg[x];    bool vis[1005]={0};    rep(i,1,n){        if(x<a[i]) break;        for(int j=1;j+a[i]-1<=x;++j){            int t1=0;            t1=t1^dfs(j-1);            t1=t1^dfs(x-j-a[i]+1);            vis[t1]=true;        }    }    for(int i=0;;++i){        if(!vis[i]){            return sg[x]=i;        }    }}int main(){    while(scanf("%d",&n)!=EOF){        rep(i,1,n) scanf("%d",&a[i]);        sort(a+1,a+1+n);        ///去重,时间一下缩短一半,这数据....        int t1=0; int b[105]; b[0]=-1;        rep(i,1,n) if(a[i]!=b[t1]) b[++t1]=a[i];        n=t1;        rep(i,1,n) a[i]=b[i];        scanf("%d",&m);        mem(sg,-1);        while(m--){            scanf("%d",&k);            if(!dfs(k))                puts("2");            else                puts("1");        }    }}

 

hdu 2999 Stone Game, Why are you always there? (简单SG,有个优化)