2918: 【例67.2】 昆虫繁殖
内存限制:64 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:12
解决:11
题目描述
科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过$x$个月产$y$对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过$x$个月产卵),问过$z$个月以后共有成虫多少对?
$1≤x≤20,1≤y≤20,x< z≤50$。
$1≤x≤20,1≤y≤20,x< z≤50$。
输入
$x$,$y$,$z$的数值。
输出
过$z$个月以后,共有成虫对数。
样例输入 复制
1 2 8
样例输出 复制
37
提示
第1个月到8个月后(第9个月)共有成虫的对数:1 1 1 3 5 7 13 23 37
第1个月到8个月后(第9个月)新增虫卵的对数:0 2 2 2 6 10 14 26 46
每个月都有成虫产卵。
虫卵经过2个月才能变成成虫。每个月的成虫数量是?
由前上个月的成虫和2个月之前的虫卵数量计算
每个月 (第i月)的新增的虫卵是?
由i-x个月的成虫决定(i是当前月份)
定义数组a,a[i]表示第i月昆虫成虫的数量
添加一个辅助数组b,b[i]表示第i月的新增卵的数目,从而得到两个公式:
b[i] = a[i - x] * y; (成虫经过x个月产卵 y对)
a[i] = a[i - 1] + b[i - 2]; (卵经过2个月长成成虫)
#include <iostream> using namespace std; int main() { long long a[101]={0},b[101]={0},i,j,x,y,z; cin>>x>>y>>z; for(i=1;i<=x;i++) { a[i]=1; b[i]=0; } for(i=x+1;i<=z+1;i++) { b[i]=y*a[i-x]; a[i]=a[i-1]+b[i-2]; } cout<<a[z+1]<<endl; return 0; }
#include<bits/stdc++.h> using namespace std; int x, y, n; long long bug[105], egg[105]; long long deal(int x) { long long sum = 0; for (int i = x; i >= 1; i--) { sum += bug[i]; } return sum; } int main() { cin >> x >> y >> n; bug[1] = 1; for (int i = 2; i <= n + 1; i++) { egg[i] = deal(i - x) * y; bug[i] = egg[i - 2]; } cout << deal(n + 1); return 0; }