描述:

有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:

1)先手不能在第一次把所有的石子取完,至少取1颗;

2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍;

3)取走最后一个石子的人为赢家。

结论:

如果n为斐波那契数(2,3,5,8,13,21,34,55,89...),则先手必败。

证明一:

如果按原来的套路:

由于局面不仅跟当前剩余数有关,还与上次取的数有关,所以状态中需要考虑能取的数(变得没那么直观)。

必败态:当剩余数为斐波那契数,且不能一次取完时;

    当剩余数不是斐波那契数,但其按Zeckendorf定理分解后,不能一次取完其中最小分解数时。

必胜态:当剩余数不是斐波那契数,且其按Zeckendorf定理分解后,能一次取完其中最小分解数时;

    当能一次取完时剩余数时;

只需证明:

1.必败态任一操作都将转为必胜态;

2.必胜态存在一操作转为必败态;

行但是麻烦,仅与当前局面有关的游戏,用这种分析才方便。

证明二:

当开始是斐波那契数时,用数学归纳法证明必败:

当n=2时,必败;

设当n<=f(k)时,必败;

则当n=f(k + 1)时,有f(k + 1) = f(k) + f(k - 1):

  如果取走数量大于等于f(k -1),则后手可以一次取完,由于f(k) < 2(k - 1)。

  则先手不能一次取完f(k - 1)。根据归纳法的假设,对于f(k - 1),后手必能取得f(k - 1)最后一颗。

此时,还需要证明,先手不能一次取完剩下的f(k):

  易得,先手取的石子数x = f(k - 1) / 3时,后手则取2 * f(k - 1) / 3,为最大。

  (由于后手取石子的最大值函数为max(2x, f(k - 1) - x),两者相等时最大,即x = f(k - 1) / 3)

  此时,先手能取得最大值为2 * (2 * f(k - 1) / 3),即4f(k - 1) / 3,与f(k)相比,做差可知后者大,即一次不能取完,由于假设先手必败。

证毕。

当开始不是斐波那契数列时:

由“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。

则数n可以分解为n1 + n2 + ... + nx,(1...x是下标)每个都是斐波那契数,且没有两个是连续的;

此时,只要取走最小的那个即可。由于n(x - 1)和nx不连续,则易得n(x - 1) > 2nx,即取走最小那个数后,后手不能取完第二小的数。

此时,问题分解为多个小的斐波那契数,且必败态都是对方。

ICG游戏:斐波那契博弈的更多相关文章

  1. {HDU}{2516}{取石子游戏}{斐波那契博弈}

    题意:给定一堆石子,每个人最多取前一个人取石子数的2被,最少取一个,最后取石子的为赢家,求赢家. 思路:斐波那契博弈,这个题的证明过程太精彩了! 一个重要的定理:任何正整数都可以表示为若干个不连续的斐 ...

  2. HDU 2516 取石子游戏 斐波纳契博弈

    斐波纳契博弈: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍) ...

  3. HDU 2516 取石子游戏(斐波那契博弈)

    取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  4. 51Nod 1070:Bash游戏 V4(斐波那契博弈)

    1070 Bash游戏 V4  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次拿的数量最少1个 ...

  5. HDU.2516 取石子游戏 (博弈论 斐波那契博弈)

    HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...

  6. 51Nod 1070 Bash游戏 V4(斐波那契博弈)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...

  7. 题解报告:hdu 2516 取石子游戏(斐波那契博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个, ...

  8. 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

    Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...

  9. hdu 2516 取石子游戏 (斐波那契博弈)

    题意:1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍. 取完者胜,先取者负输出"Second win",先取者胜 ...

  10. 取石子游戏 HDU2516(斐波那契博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 题目: Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任 ...

随机推荐

  1. websocket 缺点

    当时用 python 做的服务器,后来回去想再工作项目上用,但新的技术升级,随之而来还是要解决很多非技术问题, 服务器带宽,并发服务器性能方方面面考虑之后还是没有用上,十分可惜, 一个新的技术推动,尤 ...

  2. C++可调用对象与函数表

    c++的可调用对象 有 函数 函数指针 lambda表达式 bind的对象 重载了函数调用运算符的类 如何调用? 函数调用 void afuncToCall() { cout << &qu ...

  3. opencv之访问图像像素

    访问像素的三种方法 ①指针访问:最快 ②迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 ③动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 ...

  4. WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件

    在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...

  5. 20165212实验三——敏捷开发与XP实践

    20165212实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验知识点总结 (一)敏捷开发与XP 软件工程:把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过 ...

  6. lua 二进制函数使用

    由于 Lua 脚本语言本身不支持对数字的二进制操作(例如 与,或,非 等操作),MUSHclient 为此提供了一套专门用于二进制操作的函数,它们都定义在一个"bit"表中,使用时 ...

  7. HTML表单 在提交之前 验证表单数字合法性

    function checkform(){ if(!isNumeric($('.apply_money').val())){ alert("必须是数字"); return fals ...

  8. Linux进程间通信——使用信号量(转)

    这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号.下面 ...

  9. cas sso ajax的jsonp实现方案总结(新浪微薄、淘宝案例分析)

    Cas自定义登录页面Ajax实现:http://cydiay.iteye.com/blog/1738713 CAS 之 跨域 Ajax 登录实践:http://denger.iteye.com/blo ...

  10. C BIN加密

    #include <stdio.h> #include <string.h> #include <stdlib.h> #ifndef DWORD #define D ...