热带雨林的昆虫繁殖题解

热带雨林的昆虫繁殖


题目描述
科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成 虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,且可以不停繁殖,第一个月只有一对成虫,问过Z个月以后,共有成虫多少对?

输入格式
一行X,Y,Z用空格隔开,分别表示X个月产Y对卵,繁殖Z个月

1≤X≤20,1≤Y≤20,X≤Z≤39

输出格式
Z月后,成虫的对数。

样例
样例输入
1 2 8
样例输出
37
数据范围与提示
找出当月卵数量的递推式和成虫数量的递推式。


精髓:

(1)首先定义两个数组:

1.a数组表示该月新产出的卵;

2.b数组表示到现在一共的成虫的数量

(2)寻找递推式:

<1>b[i]=b[i-1]+a[i-2];

b[i-1]:第i-1月一共的成虫。

a[i-2]:因为卵两个月长成成虫,所以第i-2月产出的卵在i月刚好会变成成虫。

两个加起来即是i月一共的成虫。

<2>a[i]=a[i-x]+(b[i-x]-b[i-x-1])y;

a[i-x]:每一个月有多少个卵,那么这一个月对应着就有多少个成虫去产下卵。所以,a[i-x]就相当于第i-x月成虫的个数,这些成虫到了第i月也会产下对应的卵。

(b[i-x]-b[i-x-1])*y:因为一对卵两个月长成成虫,所以第i-1月的卵到了第i月仍是卵。"b[i-x]-b[i-x-1]"表示第i-x-1月到第i-x月增长的成虫的个数,这些成虫是由第i-x-3月产出的卵变化的,它们又会在第i-1月产卵,这些卵到了第i月还是卵。

参考代码:

#include<cstdio>
int main() {
	int x,y,z;
	long long a[55]={},b[55]={};
	scanf("%d %d %d",&x,&y,&z);
	for(int i=1;i<=x;i++) {
		a[i]=1,b[i]=0;
	}
	a[x+1]=1,b[x+1]=y;
	for(int i=x+2;i<=z+1;i++) {
		a[i]=a[i-1]+b[i-2];
		b[i]=b[i-x]+(a[i-x]-a[i-x-1])*y;
	}
	printf("%lld",a[z+1]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/PumPi/article/details/104466090