当前位置: 首页 > article >正文

*【每日一题 基础题】 [蓝桥杯 2023 省 B] 飞机降落

题目描述
N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早可以于 Ti 时刻开始降落,最晚可以于 Ti + Di 时刻开始降落。降落过程需要 Li个单位时间。
一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。
请你判断 N 架飞机是否可以全部安全降落。
输入格式
输入包含多组数据。
第一行包含一个整数 T,代表测试数据的组数。
对于每组数据,第一行包含一个整数 N。
以下 N 行,每行包含三个整数:Ti,Di 和 Li。
输出格式
对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。
样例输入
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 时刻完成降落。
对于第二组数据,无论如何安排,都会有飞机不能及时降落。
对于 30% 的数据,N ≤ 2。
对于 100% 的数据,1 ≤ T ≤ 10,1 ≤ N ≤ 10,0 ≤ Ti , Di , Li ≤ 105。

import java.util.*;  

public class Main {  
    static final int N = 10;  
    static boolean[] st = new boolean[N];  
    static int n;  
    static boolean flag = false;  
    static int[] t = new int[N];  
    static int[] d = new int[N];  
    static int[] l = new int[N];  

    static void dfs(int u, int last) {  
        if (flag) return; // If we found one valid sequence, return  
        if (u == n) { // All planes have landed  
            flag = true;  
            return;  
        }  

        for (int i = 0; i < n; i++) {  
            if (!st[i]) { // If the current plane hasn't landed yet  
                if (t[i] + d[i] >= last) { // Check if it can wait for the last plane to land  
                    st[i] = true; // Mark the plane as landed  

                    if (t[i] > last) { // If this plane arrives after the last one has landed  
                        dfs(u + 1, t[i] + l[i]); // Update last to arrival + landing time  
                    } else { // If this plane arrives before or when the last one is landing  
                        dfs(u + 1, last + l[i]); // Wait for the last plane to land  
                    }  

                    st[i] = false; // Backtrack  
                } else {  
                    return; // If it can't wait, return  
                }  
            }  
        }  
    }  

    public static void main(String[] args) {  
        Scanner scanner = new Scanner(System.in);  
        int T = scanner.nextInt();  
        while (T-- > 0) {  
            n = scanner.nextInt();  
            for (int i = 0; i < n; i++) {  
                t[i] = scanner.nextInt();  
                d[i] = scanner.nextInt();  
                l[i] = scanner.nextInt();  
            }  

            for (int i = 0; i < N; i++) {  
                st[i] = false; // Reset the landing status  
            }  

            flag = false; // Reset the flag  
            dfs(0, 0); // Start DFS  

            if (flag) {  
                System.out.println("YES");  
            } else {  
                System.out.println("NO");  
            }  
        }  
    }  
}
import java.util.*;
 
public class Main {
    static boolean flag=false;
    static boolean[] st;
    static int n;
 
    static Map<Integer,int[]> map;//
    static Scanner cin = new Scanner(System.in);
    public static void main(String[] args){
        int t= cin.nextInt();
        while(t--!=0)solve();
    }
 
    private static void solve() {
        n= cin.nextInt();
        flag=false;//标记,如果为true则搜素到答案
        st=new boolean[n];//初始胡标记数组,标记数组用于查询未安排下降的飞机,如果标记数组全为true,则代表能成功全部安排
        map=new HashMap<>();
        for (int i = 0; i < n; i++) {//输入
            int t= cin.nextInt();
            int d= cin.nextInt();
            int l= cin.nextInt();
            map.put(i,new int[]{t,d,l});
        }
        for (int i=0;i<n;i++){//枚举第一架飞机安排
            st[i]=true;//标记搜索
            dfs(map.get(i)[0]+map.get(i)[2]);//搜索下一驾飞机应该安排什么,并把时间传入下一个dfs,时间为飞机起飞时间加下降时间
            st[i]=false;//还原,取消标记
        }
        if(flag) System.out.println("YES");
        if(!flag) System.out.println("NO");
    }
 
    private static void dfs(int time) {
        boolean ok=true;//下面for循环中,如果没有再安排飞机,则代表已经成功安排所有飞机
        for (int i=0;i<n;i++){//枚举飞机
            if(st[i])continue;//如果已经下降了,不用再安排下降
            ok=false;
            if(time>map.get(i)[0]+map.get(i)[1])continue;
            int is=Math.max(time,map.get(i)[0])+map.get(i)[2];//时间取当前时间和飞机起飞时间最大那个,加上飞机下降时间
            st[i]=true;//标记
            dfs(is);//搜索下一驾飞机
            st[i]=false;//还原标记
        }
        if(ok)//代表搜素到答案 直接返回
            flag=true;
            return;
    }
}

http://www.kler.cn/a/444596.html

相关文章:

  • 火山引擎发布数据飞轮 2.0,AI 重塑企业数据消费
  • 物联网:全面概述、架构、应用、仿真工具、挑战和未来方向
  • 多协议视频监控汇聚/视频安防系统Liveweb搭建智慧园区视频管理平台
  • 顺序表的操作
  • OneCode:开启高效编程新时代——企业定制出码手册
  • 关于如何做技术文档
  • 探秘基于 SSM 与 Vue 的电脑测评系统:高效评估新体验
  • 物理机内网穿透
  • 需求解读文档
  • C++ OCR文字识别api接口
  • windows上的qt项目移植到Ubuntu上运行(贪吃蛇)
  • 架构实践02-高性能架构模式
  • Qt同步读取串口
  • 【Qt】QWidget中的常见属性及其功能(一)
  • 树莓集团为您解答:产教融合是什么意思
  • UDP协议详解
  • 探秘APP设计风格宝藏:5款模板,开启独特用户体验之旅
  • jdk和cglib动态代理区别
  • Pytorch | 从零构建AlexNet对CIFAR10进行分类
  • 鸿蒙项目云捐助第十五讲云数据库的初步使用
  • linux CentOS系统上卸载Kubernetes(k8s)
  • druid与pgsql结合踩坑记
  • js 算法
  • Excel根据身份证号,计算退休日期和剩余天数!
  • Qt-Advanced-Docking-System配置及使用、心得
  • 第十二课 Unity 内存优化_内存工具篇(Memory)详解