DFS飞机降落

问题描述

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;
}
相关推荐
Tisfy29 分钟前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-29 分钟前
【技巧】LC 136.只出现一次的数字
算法·异或
专注仿真1 小时前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
zlinear数据采集卡2 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
GeekZHR3 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
Herbert_hwt3 小时前
第七章 Java深入理解枚举类型
java·开发语言·算法
.道阻且长.3 小时前
8.LeetCode算法习题讲解--滑动窗口--长度最小的子数组
算法·leetcode·职场和发展
(❁´◡`❁)Jimmy(❁´◡`❁)4 小时前
P1156 [USACO01OPEN] 垃圾陷阱
算法·动态规划
疯狂打码的少年4 小时前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
lally.4 小时前
整数等差数列超图中的三个非微扰现象
算法