[CSP-S 2021] 廊桥分配【set】【二分】

本文介绍了如何利用set数据结构和二分查找方法解决廊桥分配问题,针对luogu P7913题目,通过建立fi和ffi表示不同分配方案下的飞机数量,探讨了增加廊桥如何影响停靠,并提供了相应的解题思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

>Link

luogu P7913


>Description

在这里插入图片描述
n ≤ 1 0 5 n\le 10^5 n105


>解题思路

跟考场上的想法一样,不过那时候没学set,不知道怎么实现边删数边二分,然后就打了一个好麻烦的堆然后挂了TT set大法好(虽然说也有set以外的方法
根据题意,想到一种方法,先处理出 f i f_i fi f f i ff_i ffi,分别表示国内/国际分到 i i

### CSP-S 2021 第一题 廊桥分配 解析 #### 题目分析 该问题的核心在于通过合理的贪心策略和数据结构设计,最大化能够停靠廊桥的飞机数量。题目分为两个部分:国内航班和国际航班,每种类型的航班都有各自的廊桥资源池[^1]。 对于每一个到达的航班,如果存在可用的廊桥,则应将其安排到编号最小的空闲廊桥上;如果没有合适的廊桥,则该航班无法停靠廊桥并被忽略。因此,我们需要维护一个动态更新的数据结构来记录当前可使用的廊桥状态,并快速找到符合条件的目标位置。 #### 数据结构选择 由于需要频繁查询“当前剩余未被占用且数值最小”的廊桥序号,可以采用 **优先队列 (Priority Queue)** 来高效完成此操作。具体来说: - 使用两个独立的优先队列分别存储国内外两类航班对应的可用廊桥集合; - 当新航班到来时,在对应类别的优先队列中寻找满足条件的最佳选项; - 如果成功匹配,则将所选廊桥移除出队列表示已被占据;待其释放后再重新加入相应类别之中[^2]。 #### 参考代码实现 以下是基于上述逻辑的一种可能解决方案: ```cpp #include <bits/stdc++.h> using namespace std; int main(){ int n,m,k; cin>>n>>m>>k; // 输入总航班数、国内廊挂数量以及国际廊挂数量 vector<int> t(n),p(n); for(int i=0;i<n;++i){ cin>>t[i]; } for(int i=0;i<n;++i){ cin>>p[i]; } priority_queue<int,vector<int>,greater<int>> pq_domestic,pq_international; // 初始化国内与国际的廊桥编号 for(int i=1;i<=m;i++)pq_domestic.push(i); for(int j=1;j<=k;j++)pq_international.push(j); int cnt=0; map<pair<int,int>,bool> used;// 记录某时刻某个廊桥是否已经被使用过 for(int i=0;i<n;i++){ if(p[i]==1 && !pq_domestic.empty()){ int bridge=pq_domestic.top(); pq_domestic.pop(); used[{t[i],bridge}]=true; cnt++; // 将廊桥恢复至空闲状态的时间设为离开时间加一时段之后 pq_domestic.emplace(bridge); }else if(p[i]==2 && !pq_international.empty()){ int bridge=pq_international.top(); pq_international.pop(); used[{t[i],bridge}]=true; cnt++; // 同样处理国际航班的情况 pq_international.emplace(bridge); } } cout<<cnt; } ``` 以上程序片段展示了如何利用优先队列解决本题中的核心需求——始终选取当前情况下最优解法下的最小值作为目标对象之一。 #### 总结说明 通过对不同种类航班各自独立管理它们所能访问范围内的所有潜在候选项列表形式化表达出来后,再借助于先进先出原则配合堆栈性质的操作模式下实现了整个流程自动化运转机制构建过程描述如下所示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值