斐波那契

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

别说谁变了你拦得住时间么 提交于 2020-02-28 04:54:27
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈, http://blog.csdn.net/acm_cxlove/article/details/7835016 ,关于斐波那契博弈的介绍,可以看看这篇博客。以下的内容便是转自这篇博客。 1、当i=2时,先手只能取1颗,显然必败,结论成立。 2、假设当i<=k时,结论成立。 则当i=k+1时,f[i] = f[k]+f[k-1]。 则我们可以把这一堆石子看成两堆,简称k堆和k-1堆。 (一定可以看成两堆,因为假如先手第一次取的石子数大于或等于f[k-1],则后手可以直接取完f[k],因为f[k] < 2*f[k-1]) 对于k-1堆,由假设可知,不论先手怎样取,后手总能取到最后一颗。下面我们分析一下后手最后取的石子数x的情况。 如果先手第一次取的石子数y>=f[k-1]/3,则这小堆所剩的石子数小于2y,即后手可以直接取完,此时x=f[k-1]-y,则x<=2/3*f[k-1]。 我们来比较一下2/3*f[k-1]与1/2*f[k]的大小。即4*f[k-1]与3*f[k]的大小,由数学归纳法不难得出,后者大。 所以我们得到,x<1/2*f[k]。 即后手取完k-1堆后,先手不能一下取完k堆,所以游戏规则没有改变

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

有些话、适合烂在心里 提交于 2020-02-28 04:53:46
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1415 Accepted Submission(s): 798 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win". Input 输入有多组.每组第1行是2<=n<2^31. n=0退出. Output 先取者负输出"Second win". 先取者胜输出"First win". 参看Sample Output. Sample Input 2 13 10000 0 Sample Output Second win Second win First win Source ECJTU 2008 Autumn Contest Recommend lcy 这是一道Fibonacci’s Game(斐波那契博弈) 斐波那契博弈模型,大致上是这样的: 有一堆个数为 n 的石子,游戏双方轮流取石子,满足: 1. 先手不能在第一次把所有的石子取完; 2.

斐波那契博弈

◇◆丶佛笑我妖孽 提交于 2020-02-28 04:42:17
题目描述 来源:牛客网 幼儿园开学了,为了让小盆友们能尽可能的多的享受假期。校长大人决定让小盆友分批到校,至于每批学生来多少人由一个小傻子和一个小仙女负责,两个人轮番负责,校长会在最后的时候去查看工作进度,小傻子不想被别人嘲笑自己傻,小仙女要证明自己比小傻子聪明。所以她们回去争抢安排最后一名小盆友。每次安排的小盆友至少为1,至多为上一次安排的2倍。小仙女抢到了先手的机会。第一次安排小盆友不能直接安排所有的小盆友一起回校。 输入描述: 单组测试数据输入一个整数n——n代表小盆的个数(n>=2&&n<=1e9) 输出描述: 输出获胜人的名字——“Xian”或者“Sha” 示例1 输入 3 输出 Sha 说明 (Fisrt)1 -> (Second) 2 || 2 - > 1 无论小仙女先送一个还是两个都会被小傻子获胜 示例2 输入 4 输出 Xian 说明 1 -> 2 -> 1 || 1 -> 1 -> 2 小仙女先送一个,小傻子无论送一个或者两个都会被小仙女取胜。思路:刚开始列出了1到8的情况,想通过找规律加分析,找出公式,却没想到这题的规律这么复杂总结:这种题目靠积累,做过的人三分钟解决,没做过的人三年也想不出来啊如果n属于斐波那契数列,那么后手胜利。 #include <iostream> #include <string.h> #include <stdio.h> using

博弈---斐波那契博弈

白昼怎懂夜的黑 提交于 2020-02-28 04:41:44
参考的这里 题目: http://acm.hdu.edu.cn/showproblem.php?pid=2516 题意: 一堆石子有n个,两人轮流取,先取者第1次可以取任意多个,但不能全部取完,以后每次取的石子数不能超过上次取子数的 2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win"。 分析:这个跟威佐夫博弈和取石子游戏有一个很大的不同点,就是游戏规则的动态化。后两者的规则中,每次可以取的石子 的策略集合是基本固定的,但是这次有规则2:一方每次可以取的石子数依赖于对手刚才取的石子数。 这个游戏叫做Fibonacci Nim,肯定和Fibonacci数列f[n]:1,2,3,5,8,13,21,34,55,89,… 有密切的关系。如果试 验一番之后,可以猜测:先手胜当且仅当n不是Fibonacci数,换句话说,必败态构成Fibonacci数列。 下面简单谈谈“先手败当且仅当n为Fibonacci数列”这一结论是怎么得来的。 这里要用到一个很有用的定理:任何正整数可以表示为若干个不连续的 Fibonacci 数之和。 这里定理涉及到数论,这里不做证明。下面只谈如何把一个正整数表示为若干个不连续的 Fibonacci 数之和。 比如,我们要分解83,注意到83被夹在55和89之间,于是把83可以写成83=55+28;然后再想办法分解28

javascript for语句实现 斐波那契数列

不问归期 提交于 2020-02-28 03:44:29
【斐波那契数列应用】 目标序列:1 1 2 3 5 8 13... 首先:找关系 f: 代表第一位 s: 代表第二位 t: 代表第三位 我们把 f s t 看做一个游标 f s t //求第三位就是第一位加第二位 1 1 2 3 5 8 13...... f s t // 求第四位就是第二位加第三位 分析: 1. 可能涉及到的参数 【运算循环的次数】 【求第n项】 并且找出他们之间的关系 2. 观察发现:运算过的次数和所求的项n,之间的关系为: n - 2 3. 每次运算完成,我们的游标 f s t指向都往后偏移一位... 4. 当游标发生偏移以后,对应的 f, s 值就要发生改变 f = s; s = t; <script> let n = Number(window.prompt('请输入目标所在位数:')); let first = second = 1; // 第一 、第二位是已知的 let three = 0; if (n > 2) { for (var i = 0; i < n - 2; i++) { three = first + second; first = second; second = three; } console.log(three); }else{ console.log(1); } </script> 来源: 51CTO 作者: Jeary0103

斐波那契变形 2013蓝桥杯C/C++ B组3 第39级台阶

為{幸葍}努か 提交于 2020-02-27 08:46:21
题面 现有39级台阶 一次只能迈出1、2步,并要求总步数为偶数 求一共有多少种走法 dfs # include <bits/stdc++.h> using namespace std ; const int maxn = 39 ; int deta [ 2 ] = { 1 , 2 } ; int num = 0 ; void dfs ( int floor , int step ) { if ( floor == maxn ) { if ( step % 2 == 0 ) { num ++ ; } return ; } if ( floor > maxn ) { return ; } for ( int i = 0 ; i < 2 ; i ++ ) { int dx = floor + deta [ i ] ; dfs ( dx , step + 1 ) ; } } int main ( ) { dfs ( 0 , 0 ) ; cout << num ; return 0 ; } 递推 bfs 洛谷相似题 台阶问题 注 用dfs搜索不失为一种万金油方法,数据规模为2^39~10e12 掌握递推思想更重要 答案51167078 斐波那契问题很重要,dp思想 来源: CSDN 作者: GOD_Dian 链接: https://blog.csdn.net/qq_39685968

7-大数斐波那契额数列

我的梦境 提交于 2020-02-18 01:24:57
链接: https://www.nowcoder.net/acm/contest/71/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 小W在计算一个数列{A n },其中A 1 =1,A 2 =2,A n+2 =A n+1 +A n 。尽管他计算非常精准,但很快他就弄混了自己的草稿纸,他找出了一些他计算的结果,但他忘记了这些都是数列中的第几项。 输入描述: 每行包括数列中的一项A k (k<=100000)。 总行数T<=30。 输出描述: 对于每一项A k ,输出一行包括一个正整数k表示输入中数是数列的第几项。 示例1 输入 2 3 5 8 13 输出 2 3 4 5 6并没有ac的答案:先用大数加法,求出每个数,在对输入的数用二分查找--->超时 #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; string a[100005]; string sum(string s1,string s2){ //大数加法(string + string, return string) if(s1.length()

LeetCode.509——斐波那契数

点点圈 提交于 2020-02-14 21:05:41
问题描述: 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 给定 N,计算 F(N)。 示例 : 输入:2 输出:1 解释:F(2) = F(1) + F(0) = 1 + 0 = 1. 问题分析: 由于计算任何一个第n(n >= 2)项的数都需要知道其前面两个数,即需要知道n-1和n-2是多少,然后两个相加得到结果,但是问题来了,要知道n-1,就要需要知道n-2,要知道n-2就需要知道n-3,会一直这样的循环递归下去,一直到第一个数,第二个,第三个.......再反推回来。 那就很明显了,大家第一时间想到的方法便是递归,就下来实现一下: 方法一:递归实现 public class Solution { public int fib(int n) { if(n <= 1){ return n; } return fib(n-1) + fib(n-2); } } ​ 问题分析: ​ 先看一下递归图: ​ 由于很多数的计算都要重复很多次,效率并不高,时间复杂度达到了 O(2^n),是斐波那契数计算中 时间复杂度最大,最不可取的方法。 ​ 空间复杂度:O(n),堆栈中需要的空间与 N

斐波那契查找

丶灬走出姿态 提交于 2020-02-08 18:15:54
斐波那契查找又称为黄金比例分割查找, 大家记不记得斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…….(从第三个数开始,后边每一个数都是前两个数的和) 然后我们会发现,随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,利用这个特性,我们就可以将黄金比例运用到查找技术中。 黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1。 0.618被公认为最具有审美意义的比例数字,这个数值的作用不仅仅体现在诸如绘画、雕塑、音乐、建筑等艺术领域,而且在管理、工程设计等方面也有着不可忽视的作用。因此被称为黄金分 割。 如何实现 如何实现斐波那契查找, 可以参考这篇CSDN博客 ,里面的代码写的很详尽。 我需要补充的一点是,并不一定非得左边是F[k-1]-1,右边是F[k-2]-1,也可以反过来,如果反过来的话只需要修改几行代码就OK了 把这一段改成 int mid = low +F[k-1]-1; if(key < temp [mid]) { high = mid -1; k- = 1 ; } else if(key > temp[mid]) { low = mid +1; k- = 2 ; } 如下: 1 int mid=low+F

斐波那契查找

北城以北 提交于 2020-02-08 12:52:20
斐波那契查找是属于二分查找的一种,提高了查找效率 查找方式在百度词条中已经说的很清楚了这里就不再写了,直接走代码,体验一下0.618的神奇 import java.util.Arrays; public class FibonacciSearch { public static int maxSize = 20; public static void main(String[] args) { int[] arr = {1, 8, 10, 89, 1000, 1234}; System.out.println(fibSearch(arr,10)); } public static int[] fib() { int[] f = new int[maxSize]; f[0] = 1; f[1] = 1; for (int i = 2; i < maxSize; i++) { f[i] = f[i - 1] + f[i - 2]; } return f; } //非递归 public static int fibSearch(int[] a, int key) { int low = 0; int high = a.length - 1; int k = 0;//斐波那契分割数值下标 int mid = 0;//mid值 int f[] = fib(); while (high > f