Python入門習題(85)——OpenJudge百練習題:羚羊數量

OpenJudge百練第4108號習題:羚羊數量

題目描述

來源
OpenJudge網站 —— 百練習題集-第4108號習題

要求
總時間限制: 3000ms 單個測試點時間限制: 1000ms 內存限制: 65536kB

描述

草原上有一種羚羊,假設它們出生時爲0歲,那麼經過3年的成長,當它們在3歲的時候會成年,並開始繁殖。每一對羚羊在3歲的那一年會產下兩隻小羚羊,並且這對成年羚羊結爲永久的伴侶,在以後的每一年又生出兩隻小羚羊。

假定一對羚羊產下的兩隻小羚羊必定爲一雄一雌,羚羊在3歲時必定會找到另外一隻同年羚羊結爲永久伴侶,並開始繁殖。此外,假定這種羚羊在50歲以內不會死去。

如果在第0年,草原上有一對0歲的羚羊,那麼第n年末草原上有多少對羚羊?

例如,第1年和第2年,草原上有1對羚羊;第3年,由於這對羚羊成年了,它們會生下一對羚羊,因此第3年末草原上有2對羚羊。

輸入
第一行是一個正整數m(1<=m<=15),表示共有m個問題。
下面m行,每行是一個數字n(0<=n<=40),表示第n年。
輸出
總共m行,每行一個數字,表示相應的第n年末草原上有幾對羚羊。
樣例輸入
3
1
3
4
樣例輸出
1
2
3
提示
結果不會超出int範圍

解題思路

  1. 畫一張表,列出前幾年0歲、1歲、2歲、3+歲(大於等於3歲)的羚羊各有多少隻。
年份 0歲 1歲 2歲 3+歲
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 1 0 0 1
4 1 1 0 1
5 1 1 1 1
6 2 1 1 2
7 3 2 1 3
  1. 列出上述表格的過程中,你會得出羚羊數量增長規律,描述如下。假設第 i 年,0歲、1歲、2歲、3+歲的羚羊各有a0, a1, a2, a3只,那麼第 i + 1年,0歲、1歲、2歲、3+歲的羚羊各有a2+a3, a0, a1, a2+a3只。
  2. 題目描述指出,年份最大不超過40。於是,求出0年到40年各年份0歲、1歲、2歲、3+歲的羚羊數量,存入year_nums列表。這樣,對於第n年,羚羊數量是sum(year_nums[n]) 。

參考答案

m = int(input())
year_nums = [(1, 0, 0, 0)]  #第0年的數量,4個分量依次是0歲、1歲、2歲、3+歲羚羊的數量
for i in range(1, 41): #根據上一年得出今年0歲、1歲、2歲、3+歲羚羊的數量
    i_nums = (year_nums[i-1][2] + year_nums[i-1][3], year_nums[i-1][0], year_nums[i-1][1], year_nums[i-1][2] + year_nums[i-1][3])
    year_nums.append(i_nums)
for i in range(m):
    n_year = int(input())
    print(sum(year_nums[n_year]))

測試用例

  1. 題目描述給出的測試用例覆蓋了前幾年的情形。

  2. 年份取第5, 6, 7年。這幾年比較好算。
    樣例輸入
    3
    5
    6
    7
    樣例輸出
    4
    6
    9

  3. m=1的邊界情形。
    樣例輸入
    1
    8
    樣例輸出
    13

  4. n=0的邊界情形。
    樣例輸入
    1
    0
    樣例輸出
    1

小結

  1. 一開始,我用變量num記住第 i 年的羚羊總數,去推算第 i + 1年的羚羊總數。然而,總是不得其法。後來發現,只記住羚羊總數是不正確的。正確的做法是,記住第 i 年,0歲、1歲、2歲、3+歲的羚羊各有幾隻。
  2. 增長規律是:假設第 i 年,0歲、1歲、2歲、3+歲的羚羊各有a0, a1, a2, a3只,那麼第 i + 1年,0歲、1歲、2歲、3+歲的羚羊各有a2+a3, a0, a1, a2+a3只。抓住這個規律,編寫程序就非常簡單了。
  3. 對於輸入的m個年份,無須每個年份分別從第0年開始計算,這樣有重複計算。事先求出0年到40年的羚羊數量,存入year_nums列表,接着一查了事。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章