每日一题 第八十三期 洛谷 [蓝桥杯 2023 省 B] 飞机降落

发布于:2024-04-10 ⋅ 阅读:(154) ⋅ 点赞:(0)

[蓝桥杯 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 N2

对于 100 % 100 \% 100% 的数据, 1 ≤ T ≤ 10 1 \leq T \leq 10 1T10 1 ≤ N ≤ 10 1 \leq N \leq 10 1N10 0 ≤ T i , D i , L i ≤ 1 0 5 0 \leq T_{i},D_{i},L_{i} \leq 10^{5} 0Ti,Di,Li105

蓝桥杯 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;
}

网站公告

今日签到

点亮在社区的每一天
去签到