#19313. 生态系统的能量金字塔

生态系统的能量金字塔

你好!我们继续探索高中生物与信息学的结合。

GESP 4级(CSP-J 普及组 T1/T2 难度)主要考察浮点数运算循环结构逻辑判断以及简单的数学模拟

这次我们选取高中生物必修三《稳态与环境》中 生态系统(Ecosystem) 的核心考点——能量流动(Energy Flow)


题目:生态系统的能量金字塔 (Energy Pyramid of Ecosystem)

【背景知识讲解】

在高中生物必修三中,我们学习了生态系统的能量流动

  1. 单向流动,逐级递减:能量只能从第一营养级(生产者)流向第二营养级(初级消费者),再流向第三营养级……不可逆转,且在每一级都会大量流失。
  2. “10%定律”:一般情况下,相邻两个营养级之间的能量传递效率大约在 10% ~ 20% 之间。剩下的 80%~90% 的能量去哪了?
    • 一部分被生物自身的呼吸作用消耗掉了(以热能形式散失)。
    • 一部分被分解者利用了(遗体残骸)。
    • 一部分未被利用。
  3. 能量金字塔:因为能量逐级递减,所以营养级越高,拥有的总能量越少,生物数量通常也越少,形成一个金字塔形状。

【题目描述】

你正在模拟一个简化的线性食物链,该食物链共有 NN 个营养级(编号 11NN)。

  • 11 级是生产者(如草)。
  • 22 级是初级消费者(如兔子)。
  • ...
  • NN 级是最高级消费者(如老鹰)。

系统给定第 11 级(生产者)固定的太阳能输入总量 EE。 从第 ii 级流向第 i+1i+1 级时,需要经历两个过程:

  1. 自身消耗:第 ii 级生物会因呼吸作用消耗掉固定的能量 CiC_i
  2. 传递效率:剩下的能量中,只有 Pi%P_i\% 的比例能被第 i+1i+1 级成功同化(获取)。

计算公式

Ei+1=(EiCi)×Pi100E_{i+1} = (E_i - C_i) \times \frac{P_i}{100}

生存判断: 在传递过程中,如果某一级生物拥有的能量 EiE_i 小于等于 0,说明能量耗尽,该营养级及之后的所有生物都会灭绝,食物链中断。

请计算:最高营养级(第 NN 级)最终能获得的能量是多少?

【输入格式】

第一行包含两个数:整数 NN 和浮点数 EE,分别表示营养级的层数和第一级获得的初始太阳能。 接下来 N1N-1 行,每行包含两个数:整数 CiC_i 和整数 PiP_i

  • kk 行的数据(Ck,PkC_k, P_k)描述的是从第 kk 级传递到第 k+1k+1 级的参数:自身消耗量和传递比例(百分比)。

【输出格式】

如果食物链中途断裂(能量 0\le 0),输出 -1。 否则,输出第 NN 级获得的能量值,结果四舍五入保留整数

【样例数据】

输入:

4 10000.0
1000 15
500 20
100 10

输出:

7

样例解释: 共有 4 个营养级,初始能量 10000。

  1. 第1级 \to 第2级
    • 消耗 C1=1000C_1 = 1000,剩余 90009000
    • 传递 P1=15%P_1 = 15\%
    • E2=9000×0.15=1350E_2 = 9000 \times 0.15 = 1350
  2. 第2级 \to 第3级
    • 消耗 C2=500C_2 = 500,剩余 1350500=8501350 - 500 = 850
    • 传递 P2=20%P_2 = 20\%
    • E3=850×0.20=170E_3 = 850 \times 0.20 = 170
  3. 第3级 \to 第4级
    • 消耗 C3=100C_3 = 100,剩余 170100=70170 - 100 = 70
    • 传递 P3=10%P_3 = 10\%
    • E4=70×0.10=7E_4 = 70 \times 0.10 = 7
    • 等等,样例输出写的是 17?让我再算一遍。
    • 10000 - 1000 = 9000; *0.15 = 1350。
    • 1350 - 500 = 850; *0.2 = 170。
    • 170 - 100 = 70; *0.1 = 7。
    • 结果是 7。

【数据范围】

  • 对于 100% 的数据:2N1,0002 \le N \le 1,000
  • 1.0E1,000,000.01.0 \le E \le 1,000,000.0
  • 0Ci10,0000 \le C_i \le 10,000
  • 0Pi1000 \le P_i \le 100
  • 最终结果在 int 范围内。

一、 思路提示

  1. 浮点数的使用
    • 能量值在计算过程中会变成小数(比如乘以 0.15),所以必须使用 double 类型来存储能量 EE
    • 输入 EE 时也要用 double
  2. 循环结构
    • 食物链有 NN 层,意味着会发生 N1N-1 次传递。
    • 我们可以写一个循环 for(int i = 1; i < N; i++)
  3. 生存检查
    • 在计算每一级之前或之后,都需要检查当前能量。
    • 公式逻辑:先减去消耗 CC,此时要判断是否 0\le 0。如果还活着,再乘以 P/100P/100
  4. 四舍五入
    • 题目要求输出整数。C++ 中 (int)(value + 0.5) 是处理正数四舍五入的常用技巧。或者使用 round() 函数。

二、 预备知识点总结

  1. 数据类型double 的定义与输入输出。
  2. 算术运算:理解百分比计算(×P/100.0\times P / 100.0)。
  3. 类型转换:浮点数转整数(四舍五入)。
  4. 循环与中断break 的使用(一旦灭绝立即停止)。

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

教练:“我们把能量想象成水流,流过一层层的梯田。”

  1. 初始
    • “最大的水池(生产者)里有 10000 升水。”
  2. 第一层流动
    • “流向下一层前,先蒸发了 1000 升(消耗)。剩 9000。”
    • “这时候水流还够吗?够(>0)。”
    • “管道比较窄,只有 15% 能流下去。9000×0.15=13509000 \times 0.15 = 1350。”
    • “第二层水池收到 1350。”
  3. 第二层流动
    • “蒸发 500。剩 1350500=8501350-500=850。”
    • “流下去 20%。850×0.2=170850 \times 0.2 = 170。”
    • “第三层收到 170。”
  4. 极端情况演示
    • “假设第三层消耗 200。170200=30170 - 200 = -30。”
    • “水干了!后面的老鹰(第四层)肯定没水喝了,直接饿死。输出 -1。”

四、 读题关键词总结

  1. “浮点数” / “四舍五入” \rightarrow 使用 double,最后用 round+0.5 强转。
  2. “小于等于 0” \rightarrow 灭绝判断条件。
  3. NN 个营养级” \rightarrow 注意循环次数是 N1N-1 次(因为是传递过程,4个点只有3条边)。

这道题将浮点数运算生态系统的能量流动结合,既考察了编程基础,又强化了“能量逐级递减”的生物学概念。对于 GESP 4 级学生来说,这是练习 double 类型和循环控制的绝佳题目。