1. 小白鼠繁殖问题解析
1.1 问题建模与规律分析
这个小白鼠繁殖问题本质上是一个变种的斐波那契数列问题。我们需要建立一个数学模型来描述小白鼠的生命周期和繁殖规律。根据题目描述:
- 新生小白鼠需要生长2个月才能开始繁殖
- 在第3、4、5个月各繁殖一对新小白鼠
- 第6个月停止繁殖
- 第7个月死亡
通过观察题目给出的示例数据,我们可以发现以下规律:
| 月份 | 总数 | 新生对数 | 死亡对数 |
|---|---|---|---|
| 1 | 1 | 1 | 0 |
| 2 | 1 | 0 | 0 |
| 3 | 2 | 1 | 0 |
| 4 | 3 | 1 | 0 |
| 5 | 5 | 2 | 0 |
| 6 | 7 | 2 | 0 |
| 7 | 10 | 4 | 1 |
| 8 | 15 | 5 | 0 |
1.2 递推公式推导
从数据中可以推导出两种递推方法:
方法一:简化递推
code复制num[i] = num[i-1] + num[i-3]
这个公式表示当前月份的小白鼠总数等于上个月的总数加上三个月前新生的对数(因为这些新生的小鼠现在开始繁殖)。
方法二:完整生命周期模型
code复制num[i] = num[i-1] + born[i] - die[i]
born[i] = born[i-2] + born[i-3] + born[i-4]
die[i] = born[i-6]
这种方法更完整地模拟了生命周期:
- born[i]表示第i个月新生的对数,来自2、3、4个月前出生的小鼠(因为它们现在处于繁殖期)
- die[i]表示第i个月死亡的对数,来自6个月前出生的小鼠
1.3 代码实现与优化
方法一实现代码分析:
cpp复制#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int n;
int num[51] = {0, 1, 1, 2, 3, 5, 7, 10};
int flag = 0;
while(cin >> n) {
for(int i = 8; i <= n; i++) {
num[i] = num[i-1] + num[i-3];
}
if(flag) cout << endl;
