DHU OJ | 进阶练习-25 繁殖问题

25 繁殖问题

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

问题描述 :

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

输入说明 :

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

输出说明 :

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

输入范例 :

1
2
3
4
5
6
7

输出范例 :

1
1
2
3
5
7
10
15
67066

笔记

这题可以和基本练习-86 母牛的数量这一题放在一起看,两题都是生殖问题,只是生殖规则不太一样。

在本题中,易知当月小白鼠的对数=上一个月小白鼠的对数+当月新增的小白鼠对数

当月新增的小白鼠是分别由两个月前、三个月前、四个月前新生的小白鼠生的。

另外,小白鼠活到第七个月时会死亡。所以在第七个月以后,当月小白鼠的对数还要再扣掉六个月前新增的小白鼠对数。


故,令第i个月的小白鼠对数为total[i],第i个月新生的小白鼠对数为b[i],则:

b[i] = b[i-2] + b[i-3] + b[i-4]

total[i] = total[i-1] + b[i] - b[i-6]

其中,i>6。

代码

#include<stdio.h>

int main(){
	int b[51],total[51];
	b[0] = -1;
	b[1] = 1;
	b[2] = 0;
	b[3] = 1;
	b[4] = 1;
	total[0] = -1;
	total[1] = 1;
	total[2] = 1;
	total[3] = 2;
	total[4] = 3;
	
	int n;
	int flag = 1;
	while(scanf("%d",&n)!=EOF){
		if(n<=4){
			if(flag){
				flag = 0;
			}else{
				printf("\n");
			}
			printf("%d",total[n]);
		}else{
			int i;
			for(i=5;i<=n;i++){
				b[i] = b[i-2] + b[i-3] + b[i-4];
				total[i] = total[i-1] + b[i];
				if(i>=7){
					total[i] -= b[i-6];
				}
			}

			if(flag){
				flag = 0;
			}else{
				printf("\n");
			}
			printf("%d",total[n]);
		}
	}
	
	return 0;	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章