飞机降落(蓝桥杯)

[蓝桥杯 2023 省 B] 飞机降落

题目描述

N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 D i D_{i} Di 个单位时间,即它最早可以于 T i T_{i} Ti 时刻开始降落,最晩可以于 T i + D i T_{i}+D_{i} Ti+Di

### C++ 蓝桥杯 飞机降落 问题 解题思路 #### 1. 数据结构设计 为了模拟飞机降落的过程,可以定义一个二维数组 `planes` 存储每架飞机的信息。其中每一行表示一架飞机的数据,具体包括: - **Ti**: 表示第i架飞机最早可开始降落的时间。 - **Di**: 表示第i架飞机允许延迟的最大时间。 此外,还需要一个布尔型数组 `st[]` 来标记哪些飞机已经成功降落[^3]。 #### 2. 深度优先搜索 (DFS) 实现 由于题目中的数据规模较小(通常不超过20),因此可以通过深度优先搜索算法枚举所有可能的降落顺序。以下是具体的实现逻辑: - 初始化变量:设置全局标志位 `flag` 记录是否存在一种方案使得所有飞机都能顺利降落;初始化布尔数组 `st[]` 全部为 `false`。 - 枚举当前待安排的飞机编号 `idx` 并尝试将其放置在合法的位置上。对于每架未被安排的飞机 $ i $ ,判断其是否能在区间 [$T_i$, $T_i + D_i$ ] 内找到合适的时刻降落。 - 如果能够安排,则递归调用函数处理下一台尚未分配的飞机;否则回溯至上一状态重新调整其他飞机的排列组合情况直至遍历完成全部可能性为止或者提前终止当已知满足条件即可结束整个过程输出相应结果["YES"] 或 ["NO"][^2]. ```cpp #include <bits/stdc++.h> using namespace std; const int MAXN = 25; // 假设最多有20架飞机 int n, t[MAXN], d[MAXN]; bool st[MAXN]; // 判断能否让 idx 号飞机安全降落 bool dfs(int idx){ if(idx > n){return true;} for(int i=1;i<=n;i++){ if(!st[i]){ bool ok=true; for(int j=t[i];j<=t[i]+d[i];j++) { if(j >= last_time && !conflict[j]) {ok=false;break;} } if(ok){ st[i]=true; last_time=j; if(dfs(idx+1)) return true; st[i]=false;// 回溯 } } } return false; } int main(){ cin>>n; memset(st,false,sizeof(st)); for(int i=1;i<=n;i++)cin>>t[i]>>d[i]; if(dfs(1)){ cout<<"YES"; }else{ cout<<"NO"; } } ``` 上述代码片段展示了如何通过递归来解决此问题的核心部分——即利用深搜技术逐一试探各航班可行的起降时机并验证整体可行性。 #### 3. 时间复杂度分析 考虑到最坏情况下需要穷尽所有排列的可能性,故总体时间开销约为 O(N!) 。然而实际运行过程中往往会因为剪枝操作而大幅减少不必要的计算量,从而保证程序能够在合理时间内得出结论。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运从未公平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值