一种斐波那契博弈(Fibonacci Nim)
事实上我也不知道这算是哪个类型的博弈
是在复习$NOIP$初赛的时候看到的一个挺有趣的博弈
所以就写出来分享一下
$upd \ on \ 2018.10.12$忽然发现这个其实就是$Fibonacci Nim$...
题目:有n张纸牌,A,B两人轮流按照以下规则取牌。
规则一:A先取,但是不能在第一次将纸牌全部取完,而且至少要取一张;
规则二:每次所取纸牌张数必须大于或等于1,且小于等于对手刚取的纸牌张数的两倍。取到最后一张牌者为胜者。
输入纸牌的张数n,判断A是否必胜,如果必胜,输出”win”,否则输出”lose”。
问题分析:当n较小时,可以归纳如下:
⑴2张牌时,先拿的人必输;
⑵3张牌时,先拿的人必输;
⑶我们先看5张牌的情况,假如我们把取5张牌分成两个步骤:先取前面2张,再取后面3张,为什么可以这样分成两个步骤?因为后取者有这个权力!先者只能取第一张,后者可以取到第二张,这样,后者就必可以取到第5张牌,先者必输。
同样,如果是8张牌时,可以分为:先取前面3张,再取后面5张,后者胜,先者必输。
结论:⑴如果牌的张数$n$是$Fibonacci$数时,先取牌者必败。 ⑵对所有非$Fibonacci$数都是先取人必赢,反之,必败。
下面给出一般性证明:
假设$n<=k$,且牌数为$Fibonacci$数时,都是取牌者必输。
那么$n=k+1$时,因为$F(k+1)=F(k)+F(k-1)$,即要取完$F(k+1)$张牌,可以分成两步:先取完$F(k-1)$张牌,再取完$F(k)$张牌。对于$F(k-1)$张牌,先取A者输!意味着对于$F(k)$张牌,A还得必须先取,所以A输。
那么,牌数为非$Fibonacci$数时,先取牌者有没有必胜的策略呢?
引用一个定理:当一个数不是$Fibonacci$数时,这个数必然等于若干个$Fibonacci$数之和,并且这些$Fibonacci$数在$Fibonacci$数列中都不相邻。
比如:$78=55+23=55+21+2$(其中55,21,2都是$Fibonacci$数);
对于非$Fibonacci$数$a0$,设f(n)是小于4a0$的最大$Fibonacci$数。
$a0=f(n)+…+f(i)+f(j)$,其中$f(j)$是式中最小的$Fibonacci$数,$f(i)$是第二小的$Fibonacci$数。由于$f(i)$、$f(j)$在$Fibonacci$数列中并不是相邻的,所以$f(i)>2*f(j)$。所以先取者可以直接取走$f(j)$张牌,后取者无法一次取走$f(i)$张牌,$f(i)$是$Fibonacci$数,由前面的分析,后取者必败。
结论:对所有非$Fibonacci$数都是先取人必赢,反之,必败。
一种斐波那契博弈(Fibonacci Nim)的更多相关文章
- 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)(转)
(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.若(m+1) | n,则先手必败,否则先手必胜.显然,如果n=m+1 ...
- HDU 2516 取石子游戏(斐波那契博弈)
取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- python实现斐波那契数列(Fibonacci sequence)
使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐 ...
- 简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理)
博弈论入门: 巴什博弈: 两个顶尖聪明的人在玩游戏,有一堆$n$个石子,每次每个人能取$[1,m]$个石子,不能拿的人输,请问先手与后手谁必败? 我们分类讨论一下这个问题: 当$n\le m$时,这时 ...
- 51Nod 1070 Bash游戏 V4(斐波那契博弈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...
- hdu2516斐波那契博弈
刚开始想用sg函数做,想了半天没一点思路啊. 原来这是一个新题型,斐波那契博弈 斐波那契博弈模型:有一堆个数为 n 的石子,游戏双方轮流取石子,满足:1. 先手不能在第一次把所有的石子取完:2. 之后 ...
- 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))
Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...
- {HDU}{2516}{取石子游戏}{斐波那契博弈}
题意:给定一堆石子,每个人最多取前一个人取石子数的2被,最少取一个,最后取石子的为赢家,求赢家. 思路:斐波那契博弈,这个题的证明过程太精彩了! 一个重要的定理:任何正整数都可以表示为若干个不连续的斐 ...
- 第2章 数字之魅——斐波那契(Fibonacci)数列
斐波那契(Fibonacci)数列 问题描述 递归算法: package chapter2shuzizhimei.fibonacci; /** * Fibonacci数列递归求解 * @author ...
随机推荐
- kettle 安装mysql 驱动
错误连接数据库 [mysql] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying ...
- react-native 完整实现登录功能
react native实现登录功能,包括ui的封装.网络请求的封装.导航器的实现.点击事件. demo下载:react-native 完整实现登录功能 后台如果是springmvc实现的需要配置上如 ...
- 3.对神经网络训练中Epoch的理解
代表的是迭代的次数,如果过少会欠拟合,反之过多会过拟合 EPOCHS 当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个 epoch. 然而,当一个 epoch 对于计算机而言太 ...
- 常见的SQLALCHEMY列类型.配置选项和关系选项
类型名称 python类型 描述 Integer int 常规整形,通常为32位 SmallInteger int 短整形,通常为16位 BigInteger int或long 精度不受限整形 Flo ...
- [LeetCode] 256. Paint House_Easy tag: Dynamic Programming
There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...
- nodejs 将网上的图片下载到本地文件
var request = require('request'); var fs = require('fs'); var img_src = 'https://www.baidu.com/img/b ...
- python基础24 -----python中的各种锁
一.全局解释器锁(GIL) 1.什么是全局解释器锁 在同一个进程中只要有一个线程获取了全局解释器(cpu)的使用权限,那么其他的线程就必须等待该线程的全局解释器(cpu)使 用权消失后才能使用全局解释 ...
- testng入门教程2用TestNG编写测试及执行测试
编写TestNG测试基本上包括以下步骤: 测试和编写业务逻辑,在代码中插入TestNG的注解.. 添加一个testng.xml文件或build.xml中在测试信息(例如类名,您想要运行的组,等..) ...
- Lintcode: First Position of Target (Binary Search)
Binary search is a famous question in algorithm. For a given sorted array (ascending order) and a ta ...
- 剑指offer4
中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历.中序周游.在二叉树中,先左后根再右.巧记:左根右. 现在有一个问题,已知二叉树的前序遍历和中序遍历:PreOrder: GDAFE ...