日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通 1312:【例3.4】昆虫繁殖

發(fā)布時(shí)間:2025/3/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通 1312:【例3.4】昆虫繁殖 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【題目鏈接】

ybt 1312:【例3.4】昆蟲(chóng)繁殖
附加條件:該題結(jié)果可以由long long類(lèi)型表示

【題目解析】

該題“每對(duì)成蟲(chóng)過(guò)x個(gè)月產(chǎn)y對(duì)卵”這句有誤,實(shí)際應(yīng)該為“每對(duì)成蟲(chóng)過(guò)x個(gè)月每個(gè)月產(chǎn)y對(duì)卵”,一本通書(shū)第五版P215這道題就是這樣寫(xiě)的。OJ抄錄時(shí)少了“每個(gè)月”三個(gè)字,導(dǎo)致理解困難。這句話(huà)描述為:

【題目考點(diǎn)】

1. 遞推

【解題思路】

首先要理解題意
該題中指說(shuō)的蟲(chóng)無(wú)論是題目還是結(jié)果,都是以“對(duì)”為單位的,不涉及“一對(duì)是兩個(gè)”這種換算。
我們認(rèn)為將蟲(chóng)子分為三種形態(tài):卵,幼蟲(chóng)(不能產(chǎn)卵),成蟲(chóng)(可以產(chǎn)卵)
題目中每對(duì)卵要過(guò)2個(gè)月長(zhǎng)成成蟲(chóng),每對(duì)成蟲(chóng)過(guò)x個(gè)月每個(gè)月產(chǎn)y對(duì)卵這句話(huà)應(yīng)該這樣理解:

假設(shè)這句話(huà)中x為3,y為1,我們可以假定有以下具體場(chǎng)景
一對(duì)成蟲(chóng)在1月初產(chǎn)了一對(duì)卵,這對(duì)卵過(guò)2個(gè)月,在3月初變?yōu)橐粚?duì)幼蟲(chóng),再過(guò)3個(gè)月(也就是x個(gè)月),在6月初變?yōu)橐粚?duì)成蟲(chóng),這對(duì)成蟲(chóng)在6月初產(chǎn)了一對(duì)卵。
這對(duì)新的卵過(guò)了2個(gè)月在8月初變?yōu)橛紫x(chóng),在11月初變?yōu)槌上x(chóng),并產(chǎn)卵。

我們把不能產(chǎn)卵的蟲(chóng)稱(chēng)為幼蟲(chóng),這樣更方便理解。

設(shè)數(shù)組a與b,a[i]表示第i個(gè)月有多少對(duì)蟲(chóng),b[i]表示第i個(gè)月出生的卵的數(shù)量。

  • 現(xiàn)在初始狀態(tài)下只有一對(duì)剛剛從卵變成的幼蟲(chóng),要在x個(gè)月之后才能開(kāi)始第一次產(chǎn)卵。

假設(shè)x是3,寫(xiě)出具體例子理解一下:
1月初有一對(duì)剛剛從卵變成的幼蟲(chóng),3個(gè)月(也就是x個(gè)月后)在4月初這對(duì)幼蟲(chóng)變?yōu)槌上x(chóng),并產(chǎn)卵。

幼蟲(chóng)在x個(gè)月后,也就是第x+1月才能開(kāi)始產(chǎn)卵。那么前x個(gè)月只有一對(duì)蟲(chóng),對(duì)所有i滿(mǎn)足1≤i≤x1\le i\le x1ix,有a[i]=1,b[i]=0。

  • 類(lèi)比兔子繁殖(斐波那契數(shù)列)問(wèn)題中:當(dāng)月的成年兔子可以分為上個(gè)月就已經(jīng)是成年的兔子,和這個(gè)月剛剛成年的兔子。
    考慮某個(gè)月的蟲(chóng),可以分為上個(gè)月就已經(jīng)有的蟲(chóng)(成蟲(chóng)或幼蟲(chóng)),和這個(gè)月剛剛從卵變成的幼蟲(chóng)。
    第i個(gè)月的上個(gè)月的蟲(chóng)子數(shù)量為a[i-1]。
    假設(shè)蟲(chóng)卵在第m月出生,那么這些卵會(huì)在第m+2月變?yōu)橛紫x(chóng)。反過(guò)來(lái)想,第i個(gè)月的剛剛從卵變成的幼蟲(chóng),實(shí)際是第i-2月出生的蟲(chóng)卵。第i-2月出生的蟲(chóng)卵數(shù)量為b[i-2],所以這部分幼蟲(chóng)的數(shù)量為b[i-2]。
    因而有a[i] = a[i-1] + b[i-2];
  • 假設(shè)第m月卵變?yōu)橛紫x(chóng),那么第m+x月幼蟲(chóng)變?yōu)槌上x(chóng)。反過(guò)來(lái)想:第i月的成蟲(chóng),最晚是在第i-x月從卵變?yōu)橛紫x(chóng)。第i-x月后再?gòu)穆炎兂傻挠紫x(chóng),在第i月必然是幼蟲(chóng),不是成蟲(chóng)。。
    第i-x月的成蟲(chóng)在第i月當(dāng)然還是成蟲(chóng),第i-x月的幼蟲(chóng)在第i月夜變成了成蟲(chóng),第i個(gè)月的蟲(chóng)也不可能來(lái)自第i-x月之后變成的幼蟲(chóng)。因此第i個(gè)月的成蟲(chóng)就是第i-x月的成蟲(chóng)加幼蟲(chóng),即第i-x月的總蟲(chóng)數(shù)量a[i-x]。
    第i個(gè)月的產(chǎn)卵數(shù)量b[i],為第i個(gè)月的成蟲(chóng)數(shù)量乘以y,即b[i] = a[i-x]*y。
    題目從第1個(gè)月開(kāi)始,求z個(gè)月后的蟲(chóng)子數(shù)量,即為求a[z+1]
  • 考慮結(jié)果可能的大小。假設(shè)x為1,y為20,a的遞推式為ai=ai?1+20?ai?3>20?ai?3a_i = a_{i-1}+20\cdot a_{i-3} > 20*a_{i-3}ai?=ai?1?+20?ai?3?>20?ai?3?,那么當(dāng)z為50時(shí),求a[z+1]為a51>20?a48>202?a45>...>2016?a3=2016a_{51} > 20\cdot a_{48} > 20^2\cdot a_{45}>...>20^{16}\cdot a_{3} = 20^{16}a51?>20?a48?>202?a45?>...>2016?a3?=2016,求這個(gè)數(shù)字的位數(shù):?2016?+1≈23\lfloor 20^{16} \rfloor + 1\approx 23?2016?+123。無(wú)法用int或long long類(lèi)型表示。
    實(shí)際上確實(shí)如此,如果輸入數(shù)據(jù)為 1 20 50,將a與b的類(lèi)型設(shè)為double,會(huì)得到結(jié)果約為1.38?10241.38*10^{24}1.38?1024,和我們的估算是一致的。
  • 只能說(shuō)該題不夠嚴(yán)謹(jǐn),輸入變量范圍給定的不夠準(zhǔn)確。該題實(shí)際上如果將a與b的類(lèi)型設(shè)為long long,是可以過(guò)的。

【題解代碼】

解法1:遞推

#include<bits/stdc++.h> using namespace std; int main() {long long a[101], b[101];//a[i]:第i個(gè)月有多少對(duì)蟲(chóng) b[i]:第i個(gè)月出生的卵的數(shù)量 int x, y, z;cin >> x >> y >> z;for(int i = 1; i <= x; i++)//前x個(gè)月只有第一對(duì)幼年蟲(chóng) {a[i] = 1;b[i] = 0;}for(int i = x + 1; i <= z + 1; i++)//求第z個(gè)月后,即第z+1個(gè)月 {b[i] = a[i-x]*y; a[i] = a[i-1]+b[i-2];}cout << a[z+1] << endl;return 0; }

總結(jié)

以上是生活随笔為你收集整理的信息学奥赛一本通 1312:【例3.4】昆虫繁殖的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。