题目描述
有 $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
输出样例:
YES
NO
样例解释
对于第一组数据,可以安排第 $3$ 架飞机于 $0$ 时刻开始降落,$20$ 时刻完成降落。安排第 $2$ 架飞机于 $20$ 时刻开始降落,$30$ 时刻完成降落。安排第 $1$ 架飞机于 $30$ 时刻开始降落,$40$ 时刻完成降落。
对于第二组数据,无论如何安排,都会有飞机不能及时降落。
// 暴力解决一切
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 13;
struct Node
{
int t, d, l;
}p[N];
bool st[N];
int T, n, flag;
// 当前已经降落了 u 架飞机, 前一架飞机的降落时间为 pre
void work(int u, int pre)
{
if(u == n)
{
flag ++;
return ;
}
for(int i = 1;i <= n;i ++)
{
if(st[i] == false)
{
if(pre <= p[i].t + p[i].d)
{
st[i] = true;
if(pre >= p[i].t) work(u + 1, pre + p[i].l);
else work(u + 1, p[i].t + p[i].l);
st[i] = false; // 恢复现场
}
}
}
}
signed main()
{
cin >> T;
while(T --)
{
cin >> n;
for(int i = 1;i <= n;i ++) cin >> p[i].t >> p[i].d >> p[i].l;
memset(st, false, sizeof st);
flag = 0; // 成功的次数
work(0, -1);
if(flag) puts("YES");
else puts("NO");
}
return 0;
}