一本通 1312:【例3.4】昆虫繁殖
一本通 1312:【例3.4】昆虫繁殖
【题目描述】
科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过x个月产卵),问过z个月以后,共有成虫多少对?
0≤x≤20,1≤y≤20,X≤z≤50
【题目未阐明的条件】
- 最后成虫的答案最大值小于 9223372036854775807。
- "卵长成成虫后的第一个月不产卵(过x个月产卵) "意味着潜在的x>=1?
【输入】
x,y,z的数值。
【输出】
过z个月以后,共有成虫对数。
【输入样例】
1 2 8
【输出样例】
37
【代码样例 1】
#include<iostream>
#include<cstdio>
using namespace std;
long long a[101],b[101];
int main(){
long long x,y,z,i;
cin>>x>>y>>z;
for(i=1;i<=x;i++){
a[i]=1;
b[i]=0;//a[i]第i个月的成虫,b[i]第i个月的卵
}
for(i = x + 1; i <= z + 1; i++){//第z个月之后 所有要+1
b[i] = y * a[i - x];//第i-x月的成虫在x个月后产下y个卵
a[i] = a[i-1] + b[i-2];//第i个月的成虫等于第i-1个月的成虫数加上第i-2个月的卵
}
cout<<a[z+1]<<endl;
return 0;
}
// https://blog.csdn.net/zqhf123/article/details/104555560
【代码样例 2】
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
int x, y, z;
ll a[55], b[55];
int main(){
scanf("%d%d%d", &x, &y, &z);
for (int i = 1; i <= x; ++i)
a[i] = 1, b[i] = 0; //第一个x月的成虫数量
for (int i = x + 1; i <= z + 1; ++i){
b[i] = y*a[i - x]; //在i月的幼虫只与i-z月前的成虫有关
a[i] = a[i - 1] + b[i - 2];//第i个月的成虫只与i-1的成虫和i-2的幼虫有关。
}
printf("%lld\n", a[z + 1]);//过了z个月
}
// https://www.cnblogs.com/ALINGMAOMAO/p/10078624.html
【我的答案】
# include <bits/stdc++.h>
using namespace std;
const int MAXLEN = 56;
long long int a[MAXLEN], b[MAXLEN];
//a 成虫 b 卵
int main (){
int x, y, z;
cin>>x>>y>>z;
// 预先初始化的阶段
for(int i = 1; i <= x; i++){
a[i] = 1;
b[i] = 0;
}
//推导的阶段
for(int i = x+1; i <= z + 1; i++){//第z个月之后 所有要+1
b[i] = y * a[i - x];
a[i] = a[i-1] + b[i-2];
}
printf("%lld", a[z+1]);
//建议多学英语单词替换a b
return 0;
}
//2021年10月4日11:38:30