巴什博弈(Bash Game)

问题模型:

只有一堆n个物品,两个人轮流从这堆物品中取物品,规定每次至少取一个,最多取m个。


解决思路:

若n=m+1时,由于先手最多只能取m个,所以无论先手怎么取,剩下的都可以让后手取完,即后手必胜。


假设n=(m+1)*r+s。

(1)当s不等于0,先手要拿走s个物品,此时后手处于在剩下(m+1)*r个物品的状态进行取物品;假设

后手取k(1<=k<=m)个物品,则先手应该采取的决策时取走m+1-k个,此时让后手处于(m+1)*(r-1)个物品的

状态,如此下去,先手就可以取走最后一个石头,而将(m+1)*0的状态给予后手(即后手无法取物品,无法将

游戏继续,故先手赢)。

(2)当s等于0,后手采用(1)中先手采用的方法可以使得自己必胜,所以此时后手必胜。


总结:

当n=(m+1)*r+s(s!=0),即n%(m+1)!=0时,先手必胜。

当n=(m+1)*r+s(s==0),即n%(m+1)==0时,后手必胜。


巴什博弈的裸题:HDU 1846

推荐题目:HDU 2149&&HDU 4764&&HDU 2188&&HDU 2897&&HDU 1847  

/*
HDU 1846 取石头游戏
题意:n个石子,每次至少取一个,最多取m个,
      最后取完石子的人为胜。
分析:n%(m+1)!=0 先手必胜
      n%(m+1)==0 后手必胜
*/
#include<cstdio>

int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&m);
        if(n%(m+1)!=0)
            printf("first\n");
        else 
            printf("second\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值