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 }

 

posted @ 2018-12-22 15:32  zzer  阅读(159)  评论(0编辑  收藏  举报