飞机降落

题目:飞机降落

有 N 架飞机准备降落到某个只有一条跑道的机场。

其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早可以于 Ti 时刻开始降落,最晚可以于 Ti+Di 时刻开始降落。

降落过程需要 Li 个单位时间。

一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。

请你判断 N 架飞机是否可以全部安全降落。

输入格式

输入包含多组数据。

第一行包含一个整数 T,代表测试数据的组数。

对于每组数据,第一行包含一个整数 N。

以下 N 行,每行包含三个整数:Ti,Di 和 Li。

输出格式

对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。

数据范围

对于 30%30% 的数据,N≤2。
对于 100%100% 的数据,1≤T≤10,1≤N≤10,0≤Ti,Di,Li≤10^5

输入样例:

1
2
3
4
5
6
7
8
9
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20

输出样例:

1
2
YES
NO

样例解释

对于第一组数据,可以安排第 33 架飞机于 00 时刻开始降落,2020 时刻完成降落。安排第 22 架飞机于 2020 时刻开始降落,3030 时刻完成降落。安排第 11 架飞机于 3030 时刻开始降落,4040 时刻完成降落。

对于第二组数据,无论如何安排,都会有飞机不能及时降落。

解题思路:

​ 根据题给数据范围n <= 10,我们可以大概猜一下是贪心的做法,关于根据数据范围推断算法,可以参考由数据范围反推算法复杂度以及算法内容

​ 我们可以暴搜所有的方案,即所有飞机的全排列,在暴搜的同时,进行判断 ,当前飞机是否可以放在前一个飞机后面。如果可以,则继续搜索,如果全部的飞机都搜索到了,说明这种顺序是满足条件的,返回True;如果不可以,则停止搜索。

​ 判断的条件是:当前飞机的最晚起飞时间需要 >= 前一个飞机的降落时间。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 15;

int n;

struct Plane
{
int t, d, l;
}p[N];
bool st[N];

bool dfs(int u, int last)
{
if (u == n) return true;

for (int i = 0; i < n; i ++)
{
int t = p[i].t, d = p[i].d, l = p[i].l;
if (!st[i] && t + d >= last) //当前飞机没有被放过且当前飞机能放在前一个飞机后面
{
st[i] = true;
//最早起飞时间需要在前一个飞机的降落之后也需要在该飞机的最早起飞时间之后,故取两者之最
if (dfs(u + 1, max(last, t) + l)) return true;
st[i] = false;
}
}

return false;
}

int main()
{
int t;
cin >> t;

while (t --)
{
cin >> n;
for (int i = 0; i < n; i ++)
{
int t, d, l;
cin >> t >> d >> l;
p[i] = {t, d, l};
}

memset(st, 0, sizeof st);

if (dfs(0, 0)) puts("YES");
else puts("NO");
}

return 0;
}

飞机降落
http://example.com/2023/04/16/刷题/飞机降落/
作者
Feng Tao
发布于
2023年4月16日
更新于
2023年4月21日
许可协议