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列表,接着一查了事。

你可能感兴趣的:(Python入门100道习题,Python编程)