题目描述
有 $N$ 架飞机准备降落到某个只有一条跑道的机场。
其中第 $i$ 架飞机在 $T_i$ 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 $D_i$ 个单位时间,即它最早可以于 $T_i$ 时刻开始降落,最晚可以于 $T_i + D_i$ 时刻开始降落。
降落过程需要 $L_i$ 个单位时间。
一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。
请你判断 $N$ 架飞机是否可以全部安全降落。
输入格式
输入包含多组数据。
第一行包含一个整数 $T$,代表测试数据的组数。
对于每组数据,第一行包含一个整数 $N$。
以下 $N$ 行,每行包含三个整数:$T_i$,$D_i$ 和 $L_i$。
输出格式
对于每组数据,输出 YES
或者 NO
,代表是否可以全部安全降落。
数据范围
对于 $30\\%$ 的数据,$N ≤ 2$。
对于 $100\\%$ 的数据,$1 ≤ T ≤ 10$,$1 ≤ N ≤ 10$,$0 ≤ T_i, D_i, L_i ≤ 10^5$。
输入样例:
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20
输出样例:
样例解释
对于第一组数据,可以安排第 $3$ 架飞机于 $0$ 时刻开始降落,$20$ 时刻完成降落。安排第 $2$ 架飞机于 $20$ 时刻开始降落,$30$ 时刻完成降落。安排第 $1$ 架飞机于 $30$ 时刻开始降落,$40$ 时刻完成降落。
对于第二组数据,无论如何安排,都会有飞机不能及时降落。
C++ 代码
//卡我最后一个数据点,属实是过分了,开个O2优化
#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct
{
int t;
int d;
int l;
}plane;
plane fly[12];
int order[12];
int T, n;
bool check()
{
int land_time = -1;
bool flag = true;
for(int i = 1;i <= n;i ++)
{
if(land_time > fly[order[i]].t + fly[order[i]].d)
{
flag = false;
break;
}
else
{
if(land_time <= fly[order[i]].t)
{
land_time = fly[order[i]].t + fly[order[i]].l;
}
else land_time = land_time + fly[order[i]].l;
}
}
return flag;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> T;
while(T --)
{
cin >> n;
for(int i = 1;i <= n;i ++)
{
cin >> fly[i].t >> fly[i].d >> fly[i].l;
order[i] = i;
}
bool flag = false;
do
{
if(check())
{
flag = true;
break;
}
}while(next_permutation(order + 1, order + n + 1));
if(flag) puts("YES");
else puts("NO");
}
return 0;
}