AcWing4957.飞机降落——学习笔记

news2024/10/5 16:20:18

目录

题目

代码

AC结果

思路 

〇、例子

一、获取数据

二、深度优先遍历(DFS)

1.入参

2.出口

3.判断是否找到安全降落方案

4.递推过程

5.回溯过程

6.DFS完整代码

三、输出打印


题目

4957. 飞机降落 - AcWing题库https://www.acwing.com/problem/content/description/4960/


代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int T = input.nextInt();//数据组数
		for(int i = 0; i < T; i++) {
			int N = input.nextInt();//飞机数
			int[][] a = new int[N + 1][3];
			a[0][0] = 0;//Ti
			a[0][1] = 0;//Di
			a[0][2] = 0;//Li
			for(int j = 1; j < N + 1; j++) {
				a[j][0] = input.nextInt();
				a[j][1] = input.nextInt();
				a[j][2] = input.nextInt();
			}
			boolean[] state = new boolean[N + 1];//记录飞机降落状态
			boolean[] flag = new boolean[1]; 
			flag[0] = false;//记录是否找到安全的降落方案

			
			dfs(0,state,flag,0,N,a);
			
			//输出打印
			if(flag[0]) {
				System.out.println("YES");
			}else {
				System.out.println("NO");
			}
			
		}
	}
	
	//深度优先搜索
	public static void dfs(int k,boolean state[],boolean[] flag,int t,int N,int a[][]) {  //t记录时刻
		//出口
		if(flag[0]) {
			return;
		}
		//判断是否为可行方案
		if(k == N) {
			flag[0] = true;
		}
		for(int i = 1; i < state.length; i++) {
			if(!state[i]) {//第i架飞机没有降落
				int tempt = t;
				if(t <= a[i][0] + a[i][1]) {//可以降落
					state[i] = true;
					if(t < a[i][0]) {//等飞机到了再降落
						t = a[i][0] + a[i][2];
					}else {//a[i][0] < t < a[i][0] + a[i][1]  飞机已经到了,直接降落
						t = t + a[i][2];
					}

				}else{//t > a[i][0] + a[i][1]->炸了
					return;
				}
				dfs(k+1,state,flag,t,N,a);
				
				//恢复
				state[i] = false;
				t = tempt;
			}
		}
	}
}

AC结果


思路 

这道题的解题思路的本质就是枚举,将所有可能降落的顺序都枚举一遍,判断在所有的方案中,是否存在一个安全的降落方案。利用深度优先搜索(DFS)实现上述想法,将所有降落顺序按照树的形式排列,然后采取深度优先对树进行遍历。利用一个boolean类型的flag记录是否找到安全降落的方案,若有则将其值改为true,否则为flase。最后,每一组数据根据flag的值输出“YES”或“NO”即可。

〇、例子

 以下面这组数据为例。有3架飞机,一共有6种可能的降落方案,接着一一判断是否可行。

1-2-3不可行

1-3-2不可行

2-1-3不可行

2-3-1不可行

3-1-2不可行

3-2-1可行

所以输出“YES”

1
3
0 100 10
10 10 10
0 2 20

一、获取数据

T表示数据组数;

N为某组中的飞机数;

a[i][0]为Ti,表示该组第i架飞机到达机场的时刻;

a[i][1]为Di,表示该组第i架飞机到达机场后可盘旋的时间;

a[i][0]为Li,表示该组第i架飞机降落所需耗时;

state记录第i架飞机的降落状态(是否已降落);

flag记录是否找到可行的安全降落方案;

		Scanner input = new Scanner(System.in);
		int T = input.nextInt();//数据组数
		for(int i = 0; i < T; i++) {
			int N = input.nextInt();//飞机数
			int[][] a = new int[N + 1][3];
			a[0][0] = 0;//Ti
			a[0][1] = 0;//Di
			a[0][2] = 0;//Li
			for(int j = 1; j < N + 1; j++) {
				a[j][0] = input.nextInt();
				a[j][1] = input.nextInt();
				a[j][2] = input.nextInt();
			}
			boolean[] state = new boolean[N + 1];//记录飞机降落状态
			boolean[] flag = new boolean[1]; 
			flag[0] = false;//记录是否找到安全的降落方案

二、深度优先遍历(DFS)

1.入参

public static void dfs(int k,boolean state[],boolean[] flag,int t,int N,int a[][]) { 

k表示已经降落的飞机数;

state数组表示各个飞机的降落状态;

flag[0]记录是否已经找到安全的降落方案;

t表示当前时刻;

N表示该组共有的飞机数;

a数组是一个三维数组,分别记录了每架飞机的到场时刻,可盘旋时间和降落耗时;

2.出口

		//出口
		if(flag[0]) {
			return;
		}

当flag[0]为true时,一路回溯即可。

3.判断是否找到安全降落方案

		//判断是否为可行方案
		if(k == N) {
			flag[0] = true;
		}

当已降落飞机数k等于该组飞机总数N时,即代表已经找到了安全可行的降落方案。

4.递推过程

		for(int i = 1; i < state.length; i++) {
			if(!state[i]) {//第i架飞机没有降落
				int tempt = t;
				if(t <= a[i][0] + a[i][1]) {//可以降落
					state[i] = true;
					if(t < a[i][0]) {//等飞机到了再降落
						t = a[i][0] + a[i][2];
					}else {//a[i][0] < t < a[i][0] + a[i][1]  飞机已经到了,直接降落
						t = t + a[i][2];
					}

				}else{//t > a[i][0] + a[i][1]->炸了
					return;
				}
				dfs(k+1,state,flag,t,N,a);

遍历state数组,找到哪一架飞机尚未降落。需要用一个tempt变量记录,当前时刻,一边后续回溯时使用。然后判断当前时刻t是否小于等于t <= a[i][0] + a[i][1](飞机到场时刻+余油可盘旋时间=最迟降落时刻),若满足则表示这架飞机是可以降落的(具体细分为两种情况),若不满足则这架飞机得坠机,因此这个方案不可行需要return回溯。

如果经过上述判断,确定该架飞机可以降落,有两种情况:

(1)t<a[i][0],即当前时刻小于该架飞机到场时刻。说人话就是,飞机还没飞到机场,得等飞机到机场才能开始降落。

(2)a[i][0] <= t < a[i][0] + a[i][1],当前时刻在飞机可降落的范围之内。说人话,上一架飞机完成降落,下一架飞机可以马上接着进行降落。

若当前飞机可以降落,可以再调用dfs方法,进行下一层的递推判断。若存在安全可行的降落方案,将在递推的过程中产生并判断出来。

5.回溯过程

如果当前的降落方案不可行,飞机炸了,则需要回溯到上一层选择其他降落顺序。回溯到上一层之前,需要将以下变量恢复,state[i]需要恢复为false(表示第i架飞机并没有完成降落),时间也将倒流回到tempt时刻。

6.DFS完整代码

	//深度优先搜索
	public static void dfs(int k,boolean state[],boolean[] flag,int t,int N,int a[][]) {  //t记录时刻
		//出口
		if(flag[0]) {
			return;
		}
		//判断是否为可行方案
		if(k == N) {
			flag[0] = true;
		}
		for(int i = 1; i < state.length; i++) {
			if(!state[i]) {//第i架飞机没有降落
				int tempt = t;
				if(t <= a[i][0] + a[i][1]) {//可以降落
					state[i] = true;
					if(t < a[i][0]) {//等飞机到了再降落
						t = a[i][0] + a[i][2];
					}else {//a[i][0] < t < a[i][0] + a[i][1]  飞机已经到了,直接降落
						t = t + a[i][2];
					}

				}else{//t > a[i][0] + a[i][1]->炸了
					return;
				}
				dfs(k+1,state,flag,t,N,a);
				
				//恢复
				state[i] = false;
				t = tempt;
			}
		}
	}

三、输出打印

根据flag[0]的值可以知道是否找到安全降落的方案,然后对应输出“YES”和“NO”即可。

			//输出打印
			if(flag[0]) {
				System.out.println("YES");
			}else {
				System.out.println("NO");
			}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打开 plist 文件

​ 对于使用苹果的进阶或资深玩家来说&#xff0c;有时候要编辑plist文件&#xff0c;比如要弄两个qq&#xff0c;要修改info.plist下的sku&#xff0c;而要是没有工具&#xff0c;就不能随意查看和编辑plist文件了。再有&#xff0c;可能要通过修改plist来破解某些游戏&#x…

windows服务器自带IIS搭建网站并发布公网访问【内网穿透】

文章目录1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置4.公网访问测试5.结语转载自远程源码文章&#xff1a;【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透…

协同数据交换平台详细设计方案(word)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 1 架构设计 1.1 总体架构协同数据交换平台利用企业服务总线、数据抽取ETL、消息中间件、大文件传输等相关技术&#xff0c;包括文件适配器、数据库适配器、Web服务中间件等在内…

【排序算法(四)】归并排序计数排序(非比较排序)以及八大排序算法的总结

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1、归并排序1.1 算法…

图像处理数据集

BSDS500 Berkeley Segmentation Dataset 500 是第一个用于评估超像素算法的数据集。对于参数优化&#xff0c;使用了验证集。 500张数据集200训练集train100验证集val200测试集test 每张图像有 5 个不同的高质量地面真值分割&#xff08;groundTruth,是.mat文件&#xff09; …

Android 中的混音器 AudioMixer 实现分析

Android framework 的音频处理模库 libaudioprocessing (位于 frameworks/av/media/libaudioprocessing) 提供了混音器组件 AudioMixer&#xff0c;它主要用在 audioflinger 里&#xff0c;用来将多路音频源数据混音&#xff0c;以方便送进音频设备播放出来。 音频混音操作本身…

MyBatis(九)MyBatis小技巧

一、#{}和${} #{}&#xff1a;先编译sql语句&#xff0c;再给占位符传值&#xff0c;底层是PreparedStatement实现。可以防止sql注入&#xff0c;比较常用。 ${}&#xff1a;先进行sql语句拼接&#xff0c;然后再编译sql语句&#xff0c;底层是Statement实现。存在sql注入现象。…

第09章_异常处理

第09章_异常处理 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 异常概述 1.1 什么是生活的异常 男主角小明每天开车上班&#xff0c;正常车程1小时。但是&#xff0c;不出…

计网第五章.运输层—TCP流量控制与可靠传输

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一、流量控制死锁死锁的解决&#xff1a;二、超时重传时间的选择解决方案Karn算法三、可靠传输补充&#xff1a;其实TCP的流量控制&#xff0c;可靠传输&#xff0c;拥塞控制&#xff0c;都是围绕滑动窗口机制来实现的…

SpringBoot的统一功能处理

目录 1.统一用户的的登录权限校验 最开始的用户登录 Spring拦截器 2.统一数据返回格式 统一数据的返回格式意义 统一数据返回格式的实现 3.统一异常处理 在上篇博客中我介绍了Spring AOP的基础知识,这篇博客则是AOP的实践练习,通过借助AOP实现三个目标 1.统一用户登录权…

VContainer 初体验

IOC 控制反转 IOC 提供一个对象生成容器&#xff0c;在我们需要取得某个对象时&#xff0c;不再使用New关键字进行对象生成操作&#xff0c;而是通过IOC容器内部控制来获得对象。 使用这种思想方式&#xff0c;可以让我们无需关心对象的生成方式&#xff0c;只需要告诉容器我需…

xmanager连接linux桌面教程 xmanager连接之后黑屏

xmanager 是一款专业的远程服务器管理软件&#xff0c;但习惯了使用Windows系统下的桌面&#xff0c;一时会无法适应linux服务器的命令行界面。下面我就为大家介绍xmanager连接linux桌面教程&#xff0c;xmanager连接之后黑屏的相关内容&#xff0c;让大家在使用linux更加方便。…

node.js详解

文章目录1.Node.js1.1 Node.js 模块化1.2 模块暴露数据1.2.1 模块初体验1.2.2 暴露数据1.3.导入(引入)模块1.4 JavaScript引擎1.5 什么是Node.js1.6 BFF2.包管理工具2.1 npm2.1.1 npm 的安装2.1.2 npm 基本使用2.1.2.1 初始化2.1.2.2 搜索包2.1.2.2 下载安装包2.1.2.3 require …

java遍历字符串的方法

在 java中&#xff0c;我们需要遍历字符串&#xff0c;如何遍历呢&#xff1f;首先我们先了解一下遍历的概念&#xff1a; 在我们的计算机中&#xff0c;存储的都是二进制数据&#xff0c;为了方便存储和管理&#xff0c;我们把一段数据分成多个字符串。在 java中&#xff0c;遍…

BM36-判断是不是平衡二叉树

题目 输入一棵节点数为 n 二叉树&#xff0c;判断该二叉树是否是平衡二叉树。 在这里&#xff0c;我们只需要考虑其平衡性&#xff0c;不需要考虑其是不是排序二叉树 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&#xff0c;具有以下性质&#xff1a;它是一棵空…

LabVIEW-簇数据类型

簇数据类似于 C 语言的结构体&#xff0c;创建时&#xff0c;首先将“簇”放置到前面板上&#xff1a; 然后放置簇内的元素&#xff0c;比如“数值输入控件”&#xff0c;当“簇框架”内边沿出现虚线框时&#xff0c;单击“数值输入控件”即可添加到簇中:在簇中也可以修改“数值…

常见网络协议汇总(一)

“网络协议”是指为完成特定的任务而制定的一套规则。网络协议通常用来表示数据传输中一组用于实现一个或多个OT模型级别的规则或规范。在通信时&#xff0c;网络协议定义了在通信时如何进行通信。今天海翎光电的小编就汇总了常见的网络协议&#xff0c;来一起看看。我们先回顾…

Linux基础IO(下)

Linux基础IO&#xff08;下&#xff09;FILE自己模拟实现fopen/fclose、fread/fwrite理解文件系统OS如何看待磁盘管理磁盘硬链接软连接ACM时间动态库和静态库见一见Linux下的库为什么要有库写一写库制作一个静态库制作一个动态库关于动静态库的一点小实验FILE 通过前面学习我们…

【SSM】Spring6(十二.Spring6集成MyBatis3.5)

文章目录1. 实现步骤2.具体实现2.1 准备数据库2.2 创建模块&#xff0c;引入依赖2.3 创建包2.4 创建Pojo类2.5 编写mapper接口2.6 编写Mapper配置文件2.7 编写service接口和service接口实现类2.8 编写jdbc.properties配置文件2.9 编写mybatis-config.xml配置文件2.10编写spring…

什么是数字“指纹”?

今天的网站收集有关访问者的大量信息&#xff0c;不仅用于广告、业务优化和用户体验&#xff0c;还用于安全目的。 除了 cookie 之外&#xff0c;网站还使用“指纹识别”来收集有关用户网络浏览器、硬件、设备配置、时区甚至行为模式的信息&#xff0c;以授权合法用户或取消对…