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

本文介绍了一种关于SG算法的游戏策略问题解决方法,并通过去除重复数实现了优化,显著提高了算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

一排石头,个数是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");
        }
    }
}

 

转载于:https://www.cnblogs.com/fish7/p/4005293.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值