#19312. 细菌的繁殖与生存
细菌的繁殖与生存
你好!非常高兴能继续为你设计题目。
GESP 4级(对应 CSP-J 普及组 T1/T2 难度)主要考察循环结构的灵活运用、简单模拟、数据类型选择(如 long long) 以及 取模/整除 的逻辑。
这一次,我们选取高中生物必修一《分子与细胞》和必修三《稳态与环境》中关于 种群数量增长(J型曲线) 与 环境阻力(抗生素筛选) 的知识点。
题目:细菌的繁殖与生存 (Bacterial Reproduction and Survival)
【背景知识讲解】
在高中生物中,我们学习了细菌的繁殖方式——二分裂(Binary Fission)。在理想条件下(营养充足、空间无限、无天敌),细菌种群的数量会呈指数增长,即 “J型增长曲线”。
- 分裂机制:1 个细菌分裂成 2 个,2 个变 4 个,4 个变 8 个……即每隔一段时间,数量翻倍。
然而,现实环境往往存在 “环境阻力”。例如,为了抑制细菌生长,我们在培养基中定期投放抗生素。抗生素会杀死一部分细菌,这构成了对细菌种群的自然选择。
本题模拟一个培养皿中的细菌种群,在自我繁殖(指数增长)和抗生素打击(线性减少)的双重作用下,其数量随时间的变化。
【题目描述】
实验室正在进行一项细菌培养实验。 初始时刻(第 0 分钟),培养皿中有 个细菌。 实验持续 分钟。在此期间,细菌会经历繁殖和抗生素的打击:
- 繁殖(Reproduction):每隔 分钟,细菌会完成一次分裂。此时,现有的所有细菌都会一分为二,即数量翻倍()。
- 例如:若 ,则在第 3, 6, 9... 分钟结束时,数量翻倍。
- 抗生素打击(Antibiotic Attack):每隔 分钟,自动喷雾装置会喷洒一次抗生素,导致 个 细菌死亡(数量 )。
- 例如:若 ,则在第 5, 10, 15... 分钟结束时,减少 个。
事件处理顺序: 如果在某一分钟(例如第 15 分钟),既是繁殖时刻(),又是打击时刻(),则先进行繁殖,再进行打击。
灭绝判定: 在任何时刻,如果细菌数量减少到 或以下,说明细菌已全部灭绝,数量归为 ,且之后不再繁殖也不再受打击(数量一直保持 0)。
请计算实验结束时(第 分钟末),培养皿中剩余的细菌数量。
【输入格式】
输入一行,包含 5 个整数:。 分别表示:
- :初始细菌数量。
- :繁殖周期(分钟)。
- :打击周期(分钟)。
- :每次打击杀死的细菌数量。
- :总实验时长(分钟)。
【输出格式】
输出一个整数,表示第 分钟末的细菌数量。
【样例数据】
输入:
10 3 4 5 12
输出:
95
【样例详细解释】
初始细菌数量 。实验总时长 分钟。 繁殖周期 (即第 3, 6, 9... 分钟翻倍)。 打击周期 (即第 4, 8, 12... 分钟减少 5 个)。
| 时间 (分钟) | 事件类型 | 详细计算过程 | 剩余数量 |
|---|---|---|---|
| 1 | 无 | 平静度过 | 10 |
| 2 | |||
| 3 | 繁殖 | 时间是 3 的倍数,数量翻倍: | 20 |
| 4 | 打击 | 时间是 4 的倍数,数量减 5: | 15 |
| 5 | 无 | 平静度过 | |
| 6 | 繁殖 | 时间是 3 的倍数,数量翻倍: | 30 |
| 7 | 无 | 平静度过 | |
| 8 | 打击 | 时间是 4 的倍数,数量减 5: | 25 |
| 9 | 繁殖 | 时间是 3 的倍数,数量翻倍: | 50 |
| 10 | 无 | 平静度过 | |
| 11 | |||
| 12 | 同时发生 | 既是 3 的倍数又是 4 的倍数。 1. 先繁殖: 2. 后打击: |
95 |
最终结果:实验结束时,剩余细菌数量为 95。
【补充测试建议】
为了测试代码处理灭绝情况的能力,建议在后台数据中加入以下边界情况:
测试点:快速灭绝 输入:
10 2 2 25 4
输出:
0
解释:
- 第 1 分钟:无事发生。
- 第 2 分钟:同时发生。
- 先繁殖:。
- 后打击:。
- 判定灭绝:数量变 ,归零。
- 第 3、4 分钟:细菌已灭绝,不再进行任何计算。结果为 0。
【数据范围】
- 对于 100% 的数据:
- 保证最终结果在 C++
long long范围内(不会超过 )。
一、 思路提示
- 模拟时间流逝:
- 这道题是典型的时间驱动模拟。我们可以写一个循环
for (int t = 1; t <= T; ++t),代表时间的每一分钟。
- 这道题是典型的时间驱动模拟。我们可以写一个循环
- 判断关键时刻:
- 如何判断是不是繁殖时刻?用取模运算:
if (t % A == 0)。 - 如何判断是不是打击时刻?同理:
if (t % B == 0)。
- 如何判断是不是繁殖时刻?用取模运算:
- 顺序很重要:
- 题目明确说了“若同时发生,先繁殖后打击”。
- 所以在循环内部,要先写繁殖的
if,再写打击的if。如果不小心写成了else if,就会漏掉同时发生的情况。
- 数据类型陷阱:
- 虽然初始数量 不大,但细菌是指数增长()的。
- 即使 ,如果每分钟都分裂, 是一个天文数字。
- 题目虽然限制了 和 让结果不会溢出
long long,但如果用int很可能会溢出。GESP 4级必须养成使用long long的习惯。
- 灭绝判定:
- 每次减少数量后,都要检查
count <= 0。如果是,重置为 0,并可以提前break(或者在循环里加个判断if (count == 0) continue;)。
- 每次减少数量后,都要检查
二、 预备知识点总结
- 循环模拟:
for循环的使用。 - 取模运算:
%用于判断倍数关系。 - 数据类型:
long long用于存储大整数。 - 逻辑控制:
if语句的顺序执行。
三、 启发式教学:草稿纸上的推理过程
教练:“我们把时间轴画出来,每一格代表1分钟。”
假设输入:S=5, A=2, B=3, K=2, T=6
- t=1:
- , 。无事发生。
- 数量:5。
- t=2:
- (繁殖)。数量 。
- 。
- 数量:10。
- t=3:
- 。
- (打击)。数量 。
- 数量:8。
- t=4:
- (繁殖)。数量 。
- 。
- 数量:16。
- t=5:
- 无事发生。
- 数量:16。
- t=6 (关键点!):
- (繁殖)。数量 。
- (打击)。数量 。
- 注意:如果是先打击再繁殖,就是 。结果不一样!题目说先繁殖,所以是 30。
学生总结:一定要按顺序写 if,不能乱。
四、 读题关键词总结
- “先...再...” 决定了代码中
if语句的前后顺序。 - “归为0” / “灭绝” 需要在每次减少后判断是否
<= 0。 - “ 分钟” 循环的终点。
- “数量翻倍” 指数级增长,警惕数据溢出,使用
long long。
五、 标准题解代码 (C++14)
见题解
这道题非常适合 GESP 4 级考生,既练习了基础的循环和条件判断,又引入了数据范围(long long)的考量,同时背景故事清晰易懂。