东华oj-进阶题第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

这道题刚开始的时候想多了,以为没规律……

代码:

/*
	T25 繁殖问题 
	算法概述:每月的小白鼠数量=往前一个月的+往前3~5个月新出生的-本月死亡的(
	也就是往前7个月的新出生的) 
*/ 

#include<stdio.h>
#define MAX_SIZE 52

int main()  {
	int N = 0;
	int i = 0, j = 0;
	int preBorn = 0;// 前3~5个月新出生的
	int cur[MAX_SIZE] = {0, 1, 1, 2, 3, 5, 7, 10, 15};// 本月小白鼠数量
	int newBorn[MAX_SIZE] = {0, 0, 0, 1, 1, 2, 2, 4, 5};// 本月新生小白鼠数量 
	
	for (i = 9; i <= 50; i++) {// 从第9个月开始,因为第8个月是特殊情况 
		preBorn = 0;
		for (j = i - 4; j <= i - 2; j++)
			preBorn += newBorn[j];
		cur[i] = cur[i - 1] + preBorn - newBorn[i - 6];
		newBorn[i] = preBorn;// 本月新生的 
	}
	
	while (scanf("%d", &N) != EOF) {
		printf("%d\n", cur[N]);
	}
	
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章