P1-2017级算法第一次上机 B SkyLee的超位魔法-黑暗丰穰之祭献
题目描述
王国军出动24万军队进攻纳萨利克大坟墓,Overlord SkyLee只是微微一笑,区区几十万人就想与我一教高下?让你们见识一下什么叫真正的恐怖吧,超位魔法-黑暗丰穰之祭献!刹那间,虚空中出现了一头无比恐怖的怪物,名为黑山羊幼崽。
黑山羊幼崽在出现的第5分钟变为完全体,完全体模式下每分钟可以分裂一次,产生一只新的黑山羊幼崽。(黑山羊幼崽不会被弱小的士兵杀死,也不会消失)
虽然王国军面对黑山羊幼崽只能望风而逃,但SkyLee还是想知道自己的实力有多强大,SkyLee沉浸在自己的强大力量中,无暇思考,你能帮他计算在第n分钟时一共会有多少只黑山羊幼崽么?
输入
多组数据输入
每行一个整数n,为第n分钟黑山羊幼崽的数量(总数不超过int)
输出
对于每组数据,输出一行,为第n分钟黑山羊幼崽的数量
输入样例
1
5
6
输出样例
1
2
3
附加要求
请用递归实现
思路
根据题面,黑山羊幼崽在出现的第5分钟变为完全体,也就是说第i分钟出现的黑山羊在第(i+4)分钟时开始分裂。由此可得到递推公式:f(i) = f(i-4) + f(i-1),其中f(i)代表第i分钟的黑山羊数量,是要求的量;f(i-1)代表1分钟前的黑山羊数量,也就是说1分钟前,就有这么多黑山羊,它们继续存活到了这一分钟;f(i-4)代表四分钟前的黑山羊新产生的黑山羊幼崽的数量。
在此进一步解释,大佬可以略过不看。因为就我自己来说,当时理解这个还是花了一点功夫的,毕竟数学太差。
对于任意时刻t(t >= 5),设t为当前时间,则(t-4)就是4分钟前,则根据题意,4分钟前就已经存在的山羊一定都已经变为完全体了,可以分裂了。因为最年轻的山羊的是(t-4)分钟诞生的,已经可以分裂,更不用说再之前就诞生的山羊。比如,若t = 5,则t - 4 = 1,显然第1分钟的山羊在第5分钟已经变为完全体。另外不难理解t(t<5)的山羊数量一直为1。这个相当于是初始状态。
知道并理解了递推公式:f(i) = f(i-4) + f(i-1),其中f(i)代表第i分钟的黑山羊数量,就不难写出代码了。
其实就是斐波那契数列的变体。
参考代码
1 #include<stdio.h> 2 int f(int n); 3 int main() 4 { 5 int n; 6 while(scanf("%d",&n) == 1){ 7 int result; 8 result = f(n); 9 printf("%d\n",result); 10 } 11 } 12 13 int f(int n) 14 { 15 if(n < 5) 16 return 1; 17 else 18 return f(n-1) + f(n-4); 19 }