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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

【題目鏈接】

ybt 1312:【例3.4】昆蟲繁殖
附加條件:該題結果可以由long long類型表示

【題目解析】

該題“每對成蟲過x個月產y對卵”這句有誤,實際應該為“每對成蟲過x個月每個月產y對卵”,一本通書第五版P215這道題就是這樣寫的。OJ抄錄時少了“每個月”三個字,導致理解困難。這句話描述為:

【題目考點】

1. 遞推

【解題思路】

首先要理解題意
該題中指說的蟲無論是題目還是結果,都是以“對”為單位的,不涉及“一對是兩個”這種換算。
我們認為將蟲子分為三種形態:卵,幼蟲(不能產卵),成蟲(可以產卵)
題目中每對卵要過2個月長成成蟲,每對成蟲過x個月每個月產y對卵這句話應該這樣理解:

假設這句話中x為3,y為1,我們可以假定有以下具體場景
一對成蟲在1月初產了一對卵,這對卵過2個月,在3月初變為一對幼蟲,再過3個月(也就是x個月),在6月初變為一對成蟲,這對成蟲在6月初產了一對卵。
這對新的卵過了2個月在8月初變為幼蟲,在11月初變為成蟲,并產卵。

我們把不能產卵的蟲稱為幼蟲,這樣更方便理解。

設數組a與b,a[i]表示第i個月有多少對蟲,b[i]表示第i個月出生的卵的數量。

  • 現在初始狀態下只有一對剛剛從卵變成的幼蟲,要在x個月之后才能開始第一次產卵。

假設x是3,寫出具體例子理解一下:
1月初有一對剛剛從卵變成的幼蟲,3個月(也就是x個月后)在4月初這對幼蟲變為成蟲,并產卵。

幼蟲在x個月后,也就是第x+1月才能開始產卵。那么前x個月只有一對蟲,對所有i滿足1≤i≤x1\le i\le x1ix,有a[i]=1,b[i]=0。

  • 類比兔子繁殖(斐波那契數列)問題中:當月的成年兔子可以分為上個月就已經是成年的兔子,和這個月剛剛成年的兔子。
    考慮某個月的蟲,可以分為上個月就已經有的蟲(成蟲或幼蟲),和這個月剛剛從卵變成的幼蟲
    第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];
  • 假設第m月卵變為幼蟲,那么第m+x月幼蟲變為成蟲。反過來想:第i月的成蟲,最晚是在第i-x月從卵變為幼蟲。第i-x月后再從卵變成的幼蟲,在第i月必然是幼蟲,不是成蟲。。
    第i-x月的成蟲在第i月當然還是成蟲,第i-x月的幼蟲在第i月夜變成了成蟲,第i個月的蟲也不可能來自第i-x月之后變成的幼蟲。因此第i個月的成蟲就是第i-x月的成蟲加幼蟲,即第i-x月的總蟲數量a[i-x]。
    第i個月的產卵數量b[i],為第i個月的成蟲數量乘以y,即b[i] = a[i-x]*y。
    題目從第1個月開始,求z個月后的蟲子數量,即為求a[z+1]
  • 考慮結果可能的大小。假設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?,那么當z為50時,求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,求這個數字的位數:?2016?+1≈23\lfloor 20^{16} \rfloor + 1\approx 23?2016?+123。無法用int或long long類型表示。
    實際上確實如此,如果輸入數據為 1 20 50,將a與b的類型設為double,會得到結果約為1.38?10241.38*10^{24}1.38?1024,和我們的估算是一致的。
  • 只能說該題不夠嚴謹,輸入變量范圍給定的不夠準確。該題實際上如果將a與b的類型設為long long,是可以過的。

【題解代碼】

解法1:遞推

#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; }

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。