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 }