#19245. 小肠绒毛的流水线
小肠绒毛的流水线
你好,我是阿西莫夫。
生物体内的许多过程都严格遵循着 “时序性”——先发生的先处理,后发生的后处理。这正是数据结构中 队列(Queue) 的核心特性:先进先出(FIFO, First-In First-Out)。
人体最典型的“队列”系统莫过于消化道。食物从口腔进入,经过食道、胃,最终到达小肠进行吸收。你不可能在没消化完早餐的情况下,让午餐先进入小肠。
为了考察 队列(std::queue) 的基本操作(入队、出队、判空、取队首),我为你构思了这道题目。
[OI 题库] 小肠绒毛的“流水线” (The Intestinal Queue)
题目背景
“生命是一场能量的接力,而小肠就是这场接力赛中最繁忙的交接区。”
人体的小肠内壁布满了指状突起的 绒毛(Villi),它们极大地增加了吸收面积。经过胃部处理的食糜(Chyme)在 蠕动(Peristalsis) 波的推动下,像流水线上的货物一样,依次流过小肠绒毛表面。
绒毛细胞必须按顺序处理流经的营养物质:
- 摄入(Ingest):新的营养分子随着食糜流动到达吸收区(进入队列末尾)。
- 吸收(Absorb):位于最前端的营养分子穿过细胞膜进入血液(从队列头部离开)。
如果吸收区没有营养物质,细胞就无法进行吸收工作。
题目描述
请编写一个程序来模拟小肠绒毛的吸收过程。 你需要处理 次生物信号,信号分为三种类型:
- 摄入信号 (
1 name):表示一种名为name的营养物质到达了吸收区。请将其加入等待队列。 - 吸收信号 (
2):表示绒毛细胞完成了一次转运。请输出当前队列最前端的营养物质名称,并将其从队列中移除。- 注意:如果当前队列为空(没有营养物质),则忽略该信号,并输出
Empty。
- 注意:如果当前队列为空(没有营养物质),则忽略该信号,并输出
- 查询信号 (
3):由于血液血糖浓度波动,大脑需要知道当前吸收区里一共有多少等待吸收的营养单位。请输出队列的当前大小。
输入格式
第一行一个整数 ,表示信号的数量。 接下来 行,每行描述一个信号:
1 name:其中name是一个由英文字母组成的字符串(长度 )。2:吸收操作。3:查询数量操作。
输出格式
- 对于操作
2,输出被吸收的物质名称或Empty。 - 对于操作
3,输出一个整数。 - 每个输出占一行。
样例数据
样例 1
7
1 Glucose
1 AminoAcid
3
2
1 VitaminC
2
2
2
Glucose
AminoAcid
VitaminC
*(解析:
- Glucose 入队。队列: [Glucose]
- AminoAcid 入队。队列: [Glucose, AminoAcid]
- 查询数量。输出 2。
- 吸收!队首是 Glucose。输出 Glucose。队列: [AminoAcid]
- VitaminC 入队。队列: [AminoAcid, VitaminC]
- 吸收!队首是 AminoAcid。输出 AminoAcid。队列: [VitaminC]
- 吸收!队首是 VitaminC。输出 VitaminC。队列: [])*
样例 2 (空队列边界)
4
2
1 Water
2
2
Empty
Water
Empty
数据范围
- 营养物质名称不包含空格。
阿西莫夫的解题指南
这道题是 STL std::queue 的入门级练习。
生物学与代码的映射:
- 蠕动方向:决定了数据只能单向流动 Queue。
- 摄入:对应
q.push(val)。 - 吸收:对应先访问队首
q.front(),然后弹出q.pop()。 - 空腹状态:在调用
front()或pop()之前,必须先检查q.empty(),否则程序会发生运行时错误(Runtime Error)。这是新手最容易犯的错误。