1. 问题背景与核心需求解析
机场廊桥作为连接航站楼与飞机的重要设施,其分配效率直接影响航班周转率。2021年CSP-S第三题"廊桥分配"正是基于这一现实场景设计的经典调度问题。题目要求我们在国际/国内两个区域分配有限廊桥资源,使得能够停靠的航班数量最大化。
这个问题的核心在于:当一架飞机抵达时,如果有空闲的廊桥则立即占用;如果没有可用资源则只能停靠远机位。我们需要找到一种分配方案(例如分配k个给国内,剩下的给国际),使得总共能够服务的航班数达到峰值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法选择与数据结构设计
2.1 为什么选择堆结构
面对这类区间调度问题,堆(优先队列)展现出独特优势。具体到本题,我们需要:
- 实时追踪可用廊桥编号
- 快速获取最小可用编号(贪心选择)
- 在航班离开时及时回收廊桥
普通数组的查询效率是O(n),而小根堆可以在O(1)时间获取最小值,O(logn)完成插入删除,完美匹配需求。以下是典型操作示例:
cpp复制priority_queue<int, vector<int>, greater<int>> available; // 小根堆
available.push(1); available.push(2); // 初始化可用廊桥
int bridge = available.top(); // 获取最小可用编号
available.pop(); // 占用该廊桥
available.push(bridge); // 航班离开后回收
2.2 双堆维护策略
实际解题时需要维护两个堆:
- 可用堆:存储当前空闲的廊桥编号
- 占用堆:存储正在使用的廊桥及其释放时间(pair<时间,编号>)
当处理新航班时:
- 先检查占用堆中是否有已过期的记录
- 将这些廊桥回收至可用堆
- 从可用堆分配最小编号
这种设计保证了O(nlogn)的时间复杂度,其中n为航班数量。
3. 详细解题步骤拆解
3.1 输入预处理与排序
原始输入数据需要按到达时间排序,这是贪心算法正确性的前提。建议使用结构体存储航班信息:
cpp复制struct Flight {
int arrive, depart;
bool operator<(const Flight& f) const
