#19312. 细菌的繁殖与生存

细菌的繁殖与生存

你好!非常高兴能继续为你设计题目。

GESP 4级(对应 CSP-J 普及组 T1/T2 难度)主要考察循环结构的灵活运用简单模拟数据类型选择(如 long long 以及 取模/整除 的逻辑。

这一次,我们选取高中生物必修一《分子与细胞》和必修三《稳态与环境》中关于 种群数量增长(J型曲线)环境阻力(抗生素筛选) 的知识点。


题目:细菌的繁殖与生存 (Bacterial Reproduction and Survival)

【背景知识讲解】

在高中生物中,我们学习了细菌的繁殖方式——二分裂(Binary Fission)。在理想条件下(营养充足、空间无限、无天敌),细菌种群的数量会呈指数增长,即 “J型增长曲线”

  • 分裂机制:1 个细菌分裂成 2 个,2 个变 4 个,4 个变 8 个……即每隔一段时间,数量翻倍。

然而,现实环境往往存在 “环境阻力”。例如,为了抑制细菌生长,我们在培养基中定期投放抗生素。抗生素会杀死一部分细菌,这构成了对细菌种群的自然选择。

本题模拟一个培养皿中的细菌种群,在自我繁殖(指数增长)和抗生素打击(线性减少)的双重作用下,其数量随时间的变化。

【题目描述】

实验室正在进行一项细菌培养实验。 初始时刻(第 0 分钟),培养皿中有 SS 个细菌。 实验持续 TT 分钟。在此期间,细菌会经历繁殖和抗生素的打击:

  1. 繁殖(Reproduction):每隔 AA 分钟,细菌会完成一次分裂。此时,现有的所有细菌都会一分为二,即数量翻倍(×2\times 2)。
    • 例如:若 A=3A=3,则在第 3, 6, 9... 分钟结束时,数量翻倍。
  2. 抗生素打击(Antibiotic Attack):每隔 BB 分钟,自动喷雾装置会喷洒一次抗生素,导致 KK 细菌死亡(数量 K-K)。
    • 例如:若 B=5B=5,则在第 5, 10, 15... 分钟结束时,减少 KK 个。

事件处理顺序: 如果在某一分钟(例如第 15 分钟),既是繁殖时刻(15%A==015 \% A == 0),又是打击时刻(15%B==015 \% B == 0),则先进行繁殖,再进行打击

灭绝判定: 在任何时刻,如果细菌数量减少到 00 或以下,说明细菌已全部灭绝,数量归为 00,且之后不再繁殖也不再受打击(数量一直保持 0)。

请计算实验结束时(第 TT 分钟末),培养皿中剩余的细菌数量。

【输入格式】

输入一行,包含 5 个整数:S,A,B,K,TS, A, B, K, T。 分别表示:

  • SS:初始细菌数量。
  • AA:繁殖周期(分钟)。
  • BB:打击周期(分钟)。
  • KK:每次打击杀死的细菌数量。
  • TT:总实验时长(分钟)。

【输出格式】

输出一个整数,表示第 TT 分钟末的细菌数量。

【样例数据】

输入:

10 3 4 5 12

输出:

95

【样例详细解释】

初始细菌数量 S=10S=10。实验总时长 T=12T=12 分钟。 繁殖周期 A=3A=3(即第 3, 6, 9... 分钟翻倍)。 打击周期 B=4B=4(即第 4, 8, 12... 分钟减少 5 个)。

时间 (分钟) 事件类型 详细计算过程 剩余数量
1 平静度过 10
2
3 繁殖 时间是 3 的倍数,数量翻倍:10×2=2010 \times 2 = 20 20
4 打击 时间是 4 的倍数,数量减 5:205=1520 - 5 = 15 15
5 平静度过
6 繁殖 时间是 3 的倍数,数量翻倍:15×2=3015 \times 2 = 30 30
7 平静度过
8 打击 时间是 4 的倍数,数量减 5:305=2530 - 5 = 25 25
9 繁殖 时间是 3 的倍数,数量翻倍:25×2=5025 \times 2 = 50 50
10 平静度过
11
12 同时发生 既是 3 的倍数又是 4 的倍数。
1. 先繁殖50×2=10050 \times 2 = 100
2. 后打击1005=95100 - 5 = 95
95

最终结果:实验结束时,剩余细菌数量为 95


【补充测试建议】

为了测试代码处理灭绝情况的能力,建议在后台数据中加入以下边界情况:

测试点:快速灭绝 输入:

10 2 2 25 4

输出:

0

解释:

  • 第 1 分钟:无事发生。
  • 第 2 分钟:同时发生。
    • 先繁殖:10×2=2010 \times 2 = 20
    • 后打击:2025=520 - 25 = -5
    • 判定灭绝:数量变 0\le 0,归零。
  • 第 3、4 分钟:细菌已灭绝,不再进行任何计算。结果为 0。

【数据范围】

  • 对于 100% 的数据:
  • 1S,K1001 \le S, K \le 100
  • 2A,B1002 \le A, B \le 100
  • 1T1001 \le T \le 100
  • 保证最终结果在 C++ long long 范围内(不会超过 26312^{63}-1)。

一、 思路提示

  1. 模拟时间流逝
    • 这道题是典型的时间驱动模拟。我们可以写一个循环 for (int t = 1; t <= T; ++t),代表时间的每一分钟。
  2. 判断关键时刻
    • 如何判断是不是繁殖时刻?用取模运算if (t % A == 0)
    • 如何判断是不是打击时刻?同理:if (t % B == 0)
  3. 顺序很重要
    • 题目明确说了“若同时发生,先繁殖后打击”。
    • 所以在循环内部,要先写繁殖的 if,再写打击的 if。如果不小心写成了 else if,就会漏掉同时发生的情况。
  4. 数据类型陷阱
    • 虽然初始数量 SS 不大,但细菌是指数增长(2n2^n)的。
    • 即使 T=60T=60,如果每分钟都分裂,2602^{60} 是一个天文数字。
    • 题目虽然限制了 TTAA 让结果不会溢出 long long,但如果用 int 很可能会溢出。GESP 4级必须养成使用 long long 的习惯
  5. 灭绝判定
    • 每次减少数量后,都要检查 count <= 0。如果是,重置为 0,并可以提前 break(或者在循环里加个判断 if (count == 0) continue;)。

二、 预备知识点总结

  1. 循环模拟for 循环的使用。
  2. 取模运算% 用于判断倍数关系。
  3. 数据类型long long 用于存储大整数。
  4. 逻辑控制if 语句的顺序执行。

三、 启发式教学:草稿纸上的推理过程

教练:“我们把时间轴画出来,每一格代表1分钟。” 假设输入:S=5, A=2, B=3, K=2, T=6

  1. t=1:
    • 1%201\%2 \ne 0, 1%301\%3 \ne 0。无事发生。
    • 数量:5。
  2. t=2:
    • 2%2==02\%2 == 0 (繁殖)。数量 ×210\times 2 \to 10
    • 2%302\%3 \ne 0
    • 数量:10。
  3. t=3:
    • 3%203\%2 \ne 0
    • 3%3==03\%3 == 0 (打击)。数量 28-2 \to 8
    • 数量:8。
  4. t=4:
    • 4%2==04\%2 == 0 (繁殖)。数量 ×216\times 2 \to 16
    • 4%304\%3 \ne 0
    • 数量:16。
  5. t=5:
    • 无事发生。
    • 数量:16。
  6. t=6 (关键点!):
    • 6%2==06\%2 == 0 (繁殖)。数量 ×232\times 2 \to 32
    • 6%3==06\%3 == 0 (打击)。数量 230-2 \to 30
    • 注意:如果是先打击再繁殖,就是 (162)×2=28(16-2) \times 2 = 28。结果不一样!题目说先繁殖,所以是 30。

学生总结:一定要按顺序写 if,不能乱。


四、 读题关键词总结

  1. “先...再...” \rightarrow 决定了代码中 if 语句的前后顺序。
  2. “归为0” / “灭绝” \rightarrow 需要在每次减少后判断是否 <= 0
  3. TT 分钟” \rightarrow 循环的终点。
  4. “数量翻倍” \rightarrow 指数级增长,警惕数据溢出,使用 long long

五、 标准题解代码 (C++14)

见题解

这道题非常适合 GESP 4 级考生,既练习了基础的循环和条件判断,又引入了数据范围(long long)的考量,同时背景故事清晰易懂。