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;	
}

 

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