1 条题解
-
1
题目分析
题意简述
本题存在多组测试用例,每组输入包含三个整数 、、 以及两个分隔字符。当输入的 为 时,程序结束。对于每组有效输入,模拟一个生物数量变化的过程,最终输出在第 时刻生物的总数。
输入
- 多组测试用例,每组格式为 、分隔字符、、分隔字符、。
- 当 为 时,停止输入。
输出
对于每组有效输入,输出格式为 , , : 生物总数。
解题思路
动态规划数组初始化
定义一个二维数组 来记录不同时刻不同等级生物的数量,初始时 ,意味着在第 时刻,等级为 的生物数量为 。
生物数量递推
使用循环从第 时刻开始,递推计算每个时刻不同等级生物的数量:
- 对于等级 ( 且 ),,表示每个等级的生物会在下一步提升一个等级。
- 计算当前时刻提升等级生物的总数 ,若 ,则计算新出生的生物数量 :
- 新出生生物数量 由等级为 和 的生物数量以及特定等级(与 有关)的生物数量决定。当 时,仅考虑等级为 的生物;当 时,考虑等级为 和 的生物。
- 新出生的生物等级为 ,即 。
结果计算
在第 时刻,遍历所有等级 ( 且 ),将 累加得到生物总数 ,并输出结果。
代码实现
#include <iostream> #include <vector> using namespace std; void simulate(int n, int m, int k) { vector<int> age_counts(n + 1, 0); // 索引1到n表示1到n个月的老鼠 age_counts[1] = 1; // 初始1对新生鼠 for (int month = 2; month <= k; ++month) { vector<int> new_age_counts(n + 1, 0); int total = 0; // 统计上个月总数,决定是否保留新生鼠 for (int age = 1; age <= n; ++age) { total += age_counts[age]; } // 处理存活的老鼠:年龄增加1个月 for (int age = 1; age < n; ++age) { new_age_counts[age + 1] = age_counts[age]; } // 计算新生鼠数量 int newborns = 0; for (int age = 7; age <= n; ++age) { if (age <= 8) { newborns += age_counts[age]; } else if (age <= 8 + m) { newborns += 2 * age_counts[age]; } } // 根据总数决定是否保留新生鼠 if (total <= 100) { new_age_counts[1] = newborns; } age_counts = new_age_counts; } // 计算第k个月的总数 int total = 0; for (int age = 1; age <= n; ++age) { total += age_counts[age]; } cout << n << "," << m << "," << k << ": " << total << endl; } int main() { int n, m, k; char comma; while (true) { cin >> n; if (n == -1) break; cin >> comma >> m >> comma >> k; simulate(n, m, k); } return 0; }
代码说明
-
输入处理
- 使用
while (1)
循环持续读取输入,当输入的 为 时,通过if (!(~n)) break;
终止循环。 - 读取分隔字符和 、。
- 使用
-
动态规划数组初始化
- 定义二维数组 并初始化为 ,将 设为 。
-
生物数量递推
- 使用外层循环
for (int t = 2; t <= k; t++)
遍历每个时刻。 - 内层循环
for (int liv = 2; liv <= n && liv <= t; liv++)
计算每个时刻不同等级生物的数量。 - 根据 的值和 的值计算新出生生物的数量 ,并更新 。
- 使用外层循环
-
结果计算与输出
- 遍历所有等级,将 累加得到生物总数 。
- 输出 , , : 生物总数。
- 1
信息
- ID
- 353
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者