HOJ 1846 博弈 BASH game

7 篇文章 0 订阅
#include <stdio.h>  
int main()  
{  
    int i,c,m,n;  
	scanf("%d",&c);
    while(c--)
	{
		scanf("%d %d",&n,&m);
		if(n%(m+1)||m>=n)
			printf("first\n");
		if(n%(m+1)==0)
			printf("second\n");
	}
     return 0;                   
}  


博弈问题除了有趣之外,我也想不到有什么可以形容了,知识有用之余,又可以骗下那些无知的小朋友(奸笑ing…………)


这个又是经典的说,叫做巴什博弈,英文叫Bash Game。嗯嗯,大概又是一个叫Bash的人想到的

所谓的Bash Game就是说:在只有一堆n个的物品,两人轮流从中取物品,每次至少取一个,至多取m个,最后是谁取光物品谁就是胜利者。

        先假设,n = m+1.很明显无论当前玩家从中取多少物品,都无法否认他将要输的命运,这是一个必败点。我们的目的总是为了导致必败点,

假设 m+1 < n < 2(m+1),那么当前玩家只要从中取(n-(m+1))就可以导致必败点(m+1);又假设2(m+1) < n < 3(m+1),当前玩家只要从堆中取出

(n-2(m+1))的物品,堆中剩下2(m+1)的物品,无论对手接下来取多少物品(1 <= x <= m),剩下的物品数s,m+1 < s < 2(m+1),我们又可以取走相应数

量的物品使堆中剩下m+1 个物品,所以2(m+1)也是一个必败点;如此类推堆中物品数 S = k(m+1)(k = 1,2,3……)为必败点。

            最后得出在这个游戏中:

                            1.如果m >= n,先手者必胜

                             2.如果n = k(m+1)+x (k = 1,2,3……;x <= m),先手者胜

                             3.如果n = k(m+1),后手者胜

然后…………………………你懂的



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值