【openjudge】例3.4 昆虫繁殖

【题目描述】

科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0≤X≤20, 1≤Y≤20, X≤Z≤50。

【输入】

x,y,z的数值。

【输出】

过Z个月以后,共有成虫对数。

【输入样例】

1 2 8
【输出样例】

37
输入输出样例

【算法分析:】

f[i]表示第i月的成虫数目的话

想要找出一个只含有f的递推式是很困难的,

比如f(i) = [f(i - 1) + f(i - 2) + f(i - 3) + ... + f(i - x)] * y就是错误的

因为“每对卵要过两个月长成成虫”

添加一个辅助数组e,e[i]表示第i月的卵的数目,从而得到两个公式:

e[i] = f[i - x] * y;
f[i] = f[i - 1] + e[i - 2];

注意初始条件:f[0] ~ f[x - 1] = 1


【代码:】

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 const long long MAXN = 50 + 1;
 6 
 7 long long x, y, z;
 8 long long f[MAXN], e[MAXN];
 9 
10 int main() {
11     scanf("%lld%lld%lld", &x, &y, &z);
12     for(int i = 0; i < x; i++) f[i] = 1;
13     for(int i = x; i <= z; i++) {
14         e[i] = f[i - x] * y;
15         f[i] = f[i - 1] + e[i - 2];
16     }
17     printf("%lld\n", f[z]);
18 }
昆虫繁殖

猜你喜欢

转载自www.cnblogs.com/devilk-sjj/p/9013845.html