[蓝桥杯 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 时刻开始降落。降落过程需要 L i L_{i} Li 个单位时间。
一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。
请你判断 N N N 架飞机是否可以全部安全降落。
输入格式
输入包含多组数据。
第一行包含一个整数 T T T,代表测试数据的组数。
对于每组数据,第一行包含一个整数 N N N。
以下 N N N 行,每行包含三个整数 T i , D i , L i T_{i},D_{i},L_{i} Ti,Di,Li。
输出格式
对于每组数据,输出 YES
或者 NO
,代表是否可以全部安全降落。
样例 #1
样例输入 #1
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20
样例输出 #1
YES
NO
提示
【样例说明】
对于第一组数据,可以安排第 3 架飞机于 0 时刻开始降落,20 时刻完成降落。安排第 2 架飞机于 20 时刻开始降落,30 时刻完成降落。安排第 1 架飞机于 30 时刻开始降落,40 时刻完成降落。
对于第二组数据,无论如何安排,都会有飞机不能及时降落。
【评测用例规模与约定】
对于 30 % 30 \% 30% 的数据, N ≤ 2 N \leq 2 N≤2。
对于 100 % 100 \% 100% 的数据, 1 ≤ T ≤ 10 1 \leq T \leq 10 1≤T≤10, 1 ≤ N ≤ 10 1 \leq N \leq 10 1≤N≤10, 0 ≤ T i , D i , L i ≤ 1 0 5 0 \leq T_{i},D_{i},L_{i} \leq 10^{5} 0≤Ti,Di,Li≤105。
蓝桥杯 2023 省赛 B 组 D 题。
AC代码:
#include<map>
#include<set>
#include<stack>
#include<cmath>
#include<queue>
#include<string>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<numeric>
#include<iomanip>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
const int N=3e5+10;
const int MOD=1e9 + 7;
const int INF=0X3F3F3F3F;
const int dx[]={-1,1,0,0,-1,-1,+1,+1};
const int dy[]={0,0,-1,1,-1,+1,-1,+1};
const int M = 1 << 20 ;
int t;
int n;
int a[N];
struct st{
int l;
int r;
int len;
bool operator < (const st & w) const{
if(l == w.l) return r < w.r;
else return l < w.l;
}
}s[N];
//一看题解就会一做就没有思路哎,根本想不到
bool dfs(int u, int times)//这个飞机和上个飞机降落的截至时间
{
if(u >= n + 1) return true;
else {
for(int i = 1; i <= n; i ++)
{
if(!a[i])
{
a[i] = 1;
if(s[i].r + s[i].l < times)
{
a[i] = 0;
return false;
}
int x = max(s[i].l, times) + s[i].len;
if(dfs(u + 1, x)) return true;
a[i] = 0;
}
}
}
return false;
}
int main()
{
cin >> t;
while(t --){
int flag = 0;
cin >> n;
for(int i = 1; i <= n; i ++)
{
int l, r, len;
cin >> l >> r >> len;
s[i].l = l;
s[i].r = r;
s[i].len = len;
}
// sort(s + 1, s + 1 + n);
if(dfs(1, 0)) flag = 1;
if(flag) puts("YES");
else puts("NO");
memset(a, 0, sizeof a);
}
return 0;
}