25 繁殖问题

25 繁殖问题

作者: 孙辞海 时间限制: 1S章节: 一维数组

问题描述 :

有一家生化所,一月份引入一对新生的小白鼠。这对小白鼠生长两个月后,在第三、第四、第五个月各繁殖一对新小白鼠,在第六个月停止繁殖,在第七个月则死亡。新生的小白鼠也如此繁殖。问在第N个月时,活的小白鼠有多少对?

输入说明 :

你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成,其中只有一个整数N(0 < N ≤ 50)。两组输入数据间无空行。

输出说明 :

对于每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端)输出一行,其中只有一个整数,即第N个月时活的小白鼠有几对,所有数据前后没有多余的空行,两组数据之间也没有多余的空行。

输入范例 :

1
2
3
4
5
6
7
8
30

输出范例:

1
1
2
3
5
7
10
15
67066

 

解题思路:这道题目我百思不得其解,其实这道题目和之前母牛的数量很相似,当时那道题目我采用的是递归的方式。所以此题我一开始想着直接用暴力递归解决,

但是逻辑上总有讲不通的地方,(有导致结果错误的重复计算。)

看来一下这个题目的等级,是简单,我心态更加不好了。梳理下之前的思路感觉很勉强,于是推到重来。

打开Excel表格,把能够推算出来的情况全推算出来,如下:

 

根据以上表格,我们不太容易看出题目的规律,不过没关系,我们慢慢往后看。

如:now[i] = now[i-1] + add[i];

这个就是now的规律吗?显然不完全,其中到第七项有死亡的数据1,所以我们要更改规律公式

now[i] = now[i-1] + add[i] - (该月死亡数据);

该月死亡数据是什么呢?对,是6天之前新出生的数量,即die[i] = add[i-6];i>6;(其中i=1是,我们限定add[i]=1,假定第一对小白鼠是新生的)。

所以now[i] = now[i-1] + add[i] - add[i-6];i>6;

add的规律呢,前面几项显然没有规律(后期硬性处理填充初始数据)。

结合题意,我们从第六项开始有add[i] = add[i-2] + add[i-3] + add[i-4]。i>5。

 

综上所述,我们得到以下递推公式

add[i] = add[i-2] + add[i-3] + add[i-4] (i>5)

now[i] = now[i-1] + add[i] - add[i-6];(i>6)

 

你可以看到这个递推公式是有限定条件的

1、假定第一对小白鼠是新生的,即add[1]=1;

2、递推公式不是从1开始的

为了满足以上限定条件,我们一开始建立数组的时候就填充前几项数据,后面的数据根据递推公式运算就好了。如:

int now[55]={0,1,1,2,3,5,7};
int add[55]={0,1,0,1,1,2};

(数组的下标是从0开始的,无效数据)。

完整代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include <string.h>
 5 #include <ctype.h>
 6 
 7 
 8 
 9 int now[55]={0,1,1,2,3,5,7};
10 int add[55]={0,1,0,1,1,2};
11 
12 int answer();
13 
14 
15 int main(){
16 
17     int n;
18     
19     answer();
20     while(scanf("%d",&n)!=EOF){
21         printf("%d\n",now[n]);
22     }
23     
24     return 0;
25 }
26 
27 int answer(){
28 
29     int i;
30     for(i=6;i<=51;i++){
31         add[i] = add[i-2] + add[i-3] + add[i-4];
32     }
33     for(i=7;i<=51;i++){
34         now[i] = now[i-1] + add[i] - add[i-6];
35     }
36 
37 
38     return 0;
39 }

 

 

 

 

 

 

posted @ 2020-03-17 20:36  focusDing  阅读(293)  评论(0编辑  收藏  举报