#19245. 小肠绒毛的流水线

小肠绒毛的流水线

你好,我是阿西莫夫。

生物体内的许多过程都严格遵循着 “时序性”——先发生的先处理,后发生的后处理。这正是数据结构中 队列(Queue) 的核心特性:先进先出(FIFO, First-In First-Out)

人体最典型的“队列”系统莫过于消化道。食物从口腔进入,经过食道、胃,最终到达小肠进行吸收。你不可能在没消化完早餐的情况下,让午餐先进入小肠。

为了考察 队列(std::queue) 的基本操作(入队、出队、判空、取队首),我为你构思了这道题目。


[OI 题库] 小肠绒毛的“流水线” (The Intestinal Queue)

题目背景

“生命是一场能量的接力,而小肠就是这场接力赛中最繁忙的交接区。”

人体的小肠内壁布满了指状突起的 绒毛(Villi),它们极大地增加了吸收面积。经过胃部处理的食糜(Chyme)在 蠕动(Peristalsis) 波的推动下,像流水线上的货物一样,依次流过小肠绒毛表面。

绒毛细胞必须按顺序处理流经的营养物质:

  1. 摄入(Ingest):新的营养分子随着食糜流动到达吸收区(进入队列末尾)。
  2. 吸收(Absorb):位于最前端的营养分子穿过细胞膜进入血液(从队列头部离开)。

如果吸收区没有营养物质,细胞就无法进行吸收工作。

题目描述

请编写一个程序来模拟小肠绒毛的吸收过程。 你需要处理 NN 次生物信号,信号分为三种类型:

  1. 摄入信号 (1 name):表示一种名为 name 的营养物质到达了吸收区。请将其加入等待队列。
  2. 吸收信号 (2):表示绒毛细胞完成了一次转运。请输出当前队列最前端的营养物质名称,并将其从队列中移除。
    • 注意:如果当前队列为空(没有营养物质),则忽略该信号,并输出 Empty
  3. 查询信号 (3):由于血液血糖浓度波动,大脑需要知道当前吸收区里一共有多少等待吸收的营养单位。请输出队列的当前大小。

输入格式

第一行一个整数 NN,表示信号的数量。 接下来 NN 行,每行描述一个信号:

  • 1 name:其中 name 是一个由英文字母组成的字符串(长度 20\le 20)。
  • 2:吸收操作。
  • 3:查询数量操作。

输出格式

  • 对于操作 2,输出被吸收的物质名称或 Empty
  • 对于操作 3,输出一个整数。
  • 每个输出占一行。

样例数据

样例 1

7
1 Glucose
1 AminoAcid
3
2
1 VitaminC
2
2
2
Glucose
AminoAcid
VitaminC

*(解析:

  1. Glucose 入队。队列: [Glucose]
  2. AminoAcid 入队。队列: [Glucose, AminoAcid]
  3. 查询数量。输出 2。
  4. 吸收!队首是 Glucose。输出 Glucose。队列: [AminoAcid]
  5. VitaminC 入队。队列: [AminoAcid, VitaminC]
  6. 吸收!队首是 AminoAcid。输出 AminoAcid。队列: [VitaminC]
  7. 吸收!队首是 VitaminC。输出 VitaminC。队列: [])*

样例 2 (空队列边界)

4
2
1 Water
2
2
Empty
Water
Empty

数据范围

  • 1N100,0001 \le N \le 100,000
  • 营养物质名称不包含空格。

阿西莫夫的解题指南

这道题是 STL std::queue 的入门级练习。

生物学与代码的映射:

  1. 蠕动方向:决定了数据只能单向流动 \rightarrow Queue
  2. 摄入:对应 q.push(val)
  3. 吸收:对应先访问队首 q.front(),然后弹出 q.pop()
  4. 空腹状态:在调用 front()pop() 之前,必须先检查 q.empty(),否则程序会发生运行时错误(Runtime Error)。这是新手最容易犯的错误。