问题描述
NN 架飞机准备降落到某个只有一条跑道的机场。其中第 ii 架飞机在 TiTi 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 DiDi 个单位时间,即它最早可以于 TiTi 时刻开始降落,最晚可以于 Ti+DiTi+Di 时刻开始降落。降落过程需要 LiLi 个单位时间。
一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。
请你判断 NN 架飞机是否可以全部安全降落。
输入格式
输入包含多组数据。
第一行包含一个整数 TT,代表测试数据的组数。
对于每组数据,第一行包含一个整数 NN。
以下 NN 行,每行包含三个整数:TiTi,DiDi 和 LiLi。
输出格式
对于每组数据,输出 YESYES 或者 NONO,代表是否可以全部安全降落。
代码
递归调用 dfs 函数,处理下一个元素,更新 last 为 max(p[i].t, last) + p[i].l 如果递归调用返回 false,说明当前选择不可行,将元素 i 标记为未访问 st[i] = false;
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 14;
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 ++ ) {
if(!st[i] && p[i].t+p[i].d >= last) {
st[i] = true;
if(dfs(u+1, max(p[i].t, last)+p[i].l)) return true;
st[i] = false;
}
}
return false;
}
signed main()
{
int T;
cin >> T;
while(T--){
cin >> n;
for(int i = 0; i < n; i ++ ) {
cin >> p[i].t >> p[i].d >> p[i].l;
}
memset(st,0,sizeof(st));
if(dfs(0,0)) cout << "YES"<<endl;
else cout << "NO" << endl;
}
return 0;
}