1312:【例3.4】昆虫繁殖&&递推

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

【输入】
x,y,z
的数值。

【输出】
过z
个月以后,共有成虫对数。

【输入样例】
1 2 8
【输出样例】
37

#include<bits/stdc++.h> 
using namespace std;
int main()
{
	long long a[101], b[101];//a[i]:第i个月有多少对虫  b[i]:第i个月出生的卵的数量 
    int x, y, z;
    cin >> x >> y >> z;
    for(int i = 1; i <= x; i++)//前x个月只有第一对幼年虫 
    {
        a[i] = 1;
        b[i] = 0;
    }
    for(int i = x + 1; i <= z + 1; i++)//求第z个月后,即第z+1个月 
    {
        b[i] = a[i-x]*y; 
        a[i] = a[i-1]+b[i-2];
    }
    cout << a[z+1] << endl;
    return 0;
}

感悟:关键是解题的思想,问题求z月成虫数量,想到与斐波那契数列的兔子问题相似,本月的成年兔子等已经成年兔子加上上几个月幼年兔子(过几个月刚好成年)。
思想基调确立后,将虫划分为几个时期,分别为卵期,幼虫期(不能产卵,刚刚成虫),和成虫期,然后分析,本题的几个要素,时间和好几个批次的虫,有同月进行关联,于是可以按月进行划分,于是可以用数组分别存储每个月的虫数,定义两个数组,一个成虫数,一个卵数,为什么要定义卵数而不是幼虫数,因为卵是开始,由卵可以递推到其它两个阶段,题目也围绕着,卵和成虫,而幼虫只是过渡期,表明的目的也是为了说明,第一月不能产卵。
结果导向,求z月后成虫数,要知道z+1月前的成虫数z【i-1】和b【i-2】的卵数。过两月刚好成年。同时卵数等于过x月后成虫数*y,也就是a【i-x】这一批成虫,第i-x月的成虫在第i月当然还是成虫,第i-x月的幼虫在第i月夜变成了成虫,第i个月的虫也不可能来自第i-x月之后变成的幼虫。因此第i个月的成虫就是第i-x月的成虫加幼虫,即第i-x月的总虫数量a[i-x]。注意要求的是这第i月的产卵数

posted @ 2026-03-20 11:06  Szy111  阅读(143)  评论(0)    收藏  举报