1312:【例3.4】昆虫繁殖

昆虫繁殖


 

下面的代码是标准答案,但笔者窃以为它“并不正确”!

举个例子来说吧

令x=3,y=1,z=9

第x天 1 2 3 4 5 6 7 8 9
成虫数 1 1 1 1 1 2 2 2 3
卵虫数 0 0 0 1 1 0 1 1 2)1
推导后可以知道第九天卵虫数为1对,但如果按照下面代码中的算法第九天卵虫数为2对。
为了得到第九天的卵虫数,它是直接将第六天的成虫数*y,但是第六天有一条成虫在第七天就会繁殖卵虫,在第九天不会繁殖卵虫!

1
#include<iostream> 2 #include<cstring> 3 using namespace std; 4 typedef long long ll; 5 const int N=55; 6 int main(){ 7 int x,y,z; 8 ll a[N],b[N]={0}; 9 cin>>x>>y>>z; 10 for(int i=1;i<=x;i++)a[i]=1; 11 for(int i=x+1;i<=z+1;i++){ 12 b[i]=y*a[i-x]; 13 a[i]=a[i-1]+b[i-2]; 14 } 15 cout<<a[z+1]; 16 return 0; 17 }

 


 

在发现该问题后(或许不是问题,只是我理解错了也不一定

我使用下面的代码对该问题进行我认为正确的求解(相关(详细??)注释我已经在代码中写出来了)

(测试集当然是不能过的!)

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 typedef long long ll;
 5 const int N=55;
 6 int main(){
 7     int x,y,z;
 8     ll ans=0,a[N]={0},b[N]={0};
 9     cin>>x>>y>>z;
10     a[1]=1;
11     for(int i=x+1;i<=z+1;i++){
12         //设a[i]表示第i个月刚完成繁殖的成虫+刚成长为成虫的成虫(刚准备好进行下一轮繁殖的成虫)
13         //设b[i]表示第i个月产生的卵虫数量
14         b[i]=y*a[i-x];
15         a[i]=b[i-2]+a[i-x];
16         cout<<"b["<<i<<"]="<<b[i]<<";a["<<i<<"]="<<a[i]<<endl;
17     }
18     //对几个批次的成虫数量进行相加
19     for(int i=z+1;i>z-x+1;i--)ans+=a[z+1];
20     cout<<ans;
21     return 0;
22 }

 

posted @ 2021-08-02 19:29  Rekord  阅读(1123)  评论(1编辑  收藏  举报