永爱她


私信TA

用户名:FUCKHJYH

访问量:1037

签 名:

知世故而不世故,善自嘲而不嘲人

等  级
排  名 30890
经  验 495
参赛次数 1
文章发表 3
年  龄 15
在职情况 学生
学  校 操蛋英华
专  业 理科&信息奥赛

  自我简介:

男,吉他,篮球,写诗写作,听歌写歌,c++特长,热情开朗,相貌平平,乐于助人,此生再不入爱河...

TA的其他文章

解题思路:

每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0≤X≤20,1≤Y≤20,X≤Z≤50。

在这里其实,只知道是类似斐波拉契数列的一类的递推公式,也就是经典的兔子问题。

  第i天的兔子=第i-1的兔子+第i-2的兔子


那么这道题的思路也是类似的,其实因为每个虫子从幼虫到成虫要2个月,也就是说,决定第i个月的成虫数量应该是i-1的成虫和i-2的幼虫(因为经过2个月就变成成虫了。)那么,第i个月的幼虫,应该是由第i - z个月的成虫决定的。同时,我们还需要知道一个递推公式,一定会有一个首项,那就是第一个月只有1对成虫。

类比兔子繁殖(斐波那契数列)问题中:当月的成年兔子可以分为上个月就已经是成年的兔子,和这个月刚刚成年的兔子。
考虑某个月的虫,可以分为上个月就已经有的虫(成虫或幼虫),和这个月刚刚从卵变成的幼虫
第i个月的上个月的虫子数量为a[i-1]
假设虫卵在第m月出生,那么这些卵会在第m+2月变为幼虫。反过来想,第i个月的刚刚从卵变成的幼虫,实际是第i-2月出生的虫卵。第i-2月出生的虫卵数量为b[i-2],所以这部分幼虫的数量为b[i-2]
因而有a[i] = a[i-1] + b[i-2];

而这道题题目中要求的是z个月后的成虫个数,即第z+1个月的成虫个数。我们只需定义一个数组a存储每个月成虫的个数。考虑到每个月会有卵变成新的成虫,所以我们还需定义一个数组b存储每个月的新增卵的数量。
       递推公式为 a[i] = a[i-1] + b[i-2](第i个月的成虫数量a[i],等于第(i-1)个月的成虫数量a[i-1],加上第(i-2)个月的新增卵数量b[i-2])




参考代码:

#include<iostream>
using namespace std;
int main()
{ //a[i]表示第i个月成虫对数;b[i]表示第i个月虫卵的的对数
    long long a[101]={0},b[101]={0},x=0,y=0,z=0;//归零好习惯
    cin>>x>>y>>z;
    for(i=1;i<=x;i++){a[i]=1;b[i]=0;}
    for(i=x+1;i<=z+1;i++)     //因为要统计到第z个月后,所以要for到z+1
    {
        b[i]=y*a[i-x];
        a[i]=a[i-1]+b[i-2];//主要程序(递推式)
    }
    cout<<a[z+1]<<endl;//华丽结束
    return 0;
}


 

0.0分

19 人评分

  评论区

这题的答案有问题,“成虫每过X个月产Y对卵”,那是否是说过X个月之后,每个月都会产Y对卵?当然不是。孕妇怀胎10月产子1个,只有10月胎龄的孕妇才可以产子,所以还是得每月分胎龄统计孕妇数量。
2024-11-01 20:12:13
太华丽了 大佬
2023-11-19 12:31:40
  • «
  • 1
  • »