40. 到达目的地的最短距离(第四期模拟笔试)

news2024/11/22 18:44:08

链接:卡码网KamaCoder

题目:

样例:

输入
3
输出
3

思路:

        这道题是求最少步数,联想一下 BFS,BFS 操作可得

这是一个正向的 BFS

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>
#define endl '\n'
#define x first
#define y second
#define mk make_pair
#define int long long
#define NO puts("NO")
#define YES puts("YES")
#define umap unordered_map
#define INF 0x3f3f3f3f3f3f3f3f
#define All(x) (x).begin(),(x).end()
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
using PII = pair<int, int>;

int n;

umap<int, bool>st;	// 标记是否到达过的结点

// 三个操作的遍历
inline void op(queue<int>&q,int &now)
{
	if (!st[now + 1])
	{
		st[now + 1] = true;
		q.emplace(now + 1);
	}
	if (!st[now - 1])
	{
		st[now - 1] = true;
		q.emplace(now - 1);
	}
	if (!st[now << 1])
	{
		st[now << 1] = true;
		q.emplace(now << 1);
	}
}

inline int BFS()
{
	int step = 0;
	queue<int>q;	// 建立队列
	q.emplace(0);	// 存储起点

	while (q.size())
	{
		int sz = q.size();
		while (sz--)
		{
			int now = q.front();	// 取出当前结点
			q.pop();

			st[now] = true;	// 标记当前结点

			if (now == n)
				return step;	// 如果到达了终点返回步数

			// 遍历三个操作
			op(q,now);
		}
		++step;	// 步数累加
	}
	return -1;	// 给定一个最终结果
}

inline void solve()
{
	cin >> n;
	cout << BFS() << endl;
}

signed main()
{
//	freopen("a.txt", "r", stdin);
	___G;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

提交后我们可以发现:

内存超限了部分测试数据,关键点在于   操作 3 中 x = x * 2 使得 当某个数值的时候 ,使用操作3后,有可能 x > n 不必要的数据存储在了 q 中,这就是正向 BFS 的一个小缺陷

我们可以试一下 反向BFS,以 终点 为起步存储点,往 0 方向操作,此时  now 应该被整除的时候,是最佳最少步数方案的,这样可以 避免 x = x * 2 中  x > n 的数据,节省了部分空间。

代码详解如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>
#define endl '\n'
#define x first
#define y second
#define mk make_pair
#define int long long
#define NO puts("NO")
#define YES puts("YES")
#define umap unordered_map
#define INF 0x3f3f3f3f3f3f3f3f
#define All(x) (x).begin(),(x).end()
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
using PII = pair<int, int>;

int n;

umap<int, bool>st;	// 标记是否到达过的结点

// 三个操作的遍历
inline void op(queue<int>&q,int &now)
{
	if (!st[now + 1])
	{
		st[now + 1] = true;
		q.emplace(now + 1);
	}
	if (!st[now - 1])
	{
		st[now - 1] = true;
		q.emplace(now - 1);
	}
	
	// 操作 3 中往 0 方向 走
	if (now % 2 == 0 && !st[now >> 1] )
	{
		st[now >> 1] = true;
		q.emplace(now >> 1);
	}
}

inline int BFS()
{
	int step = 0;
	queue<int>q;	// 建立队列
	
	q.emplace(n);	// 存储起点,  将 n 作为起点

	while (q.size())
	{
		int sz = q.size();
		while (sz--)
		{
			int now = q.front();	// 取出当前结点
			q.pop();

			st[now] = true;	// 标记当前结点

			if (!now)
				return step;	// 如果到达了起点返回步数

			// 遍历三个操作
			op(q,now);
		}
		++step;	// 步数累加
	}
	return -1;	// 给定一个最终结果
}

inline void solve()
{
	cin >> n;
	cout << BFS() << endl;
}

signed main()
{
//	freopen("a.txt", "r", stdin);
	___G;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

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

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

相关文章

atlas运维中遇到的问题

1、java.lang.NoClassDefFoundError&#xff1a;javax/ws/rs/core/Link$Builder 主要原因&#xff1a;jsr311-api包中javax.ws.rs.core包中没有Link类&#xff0c;而Atlas以HBase作为元数据存储&#xff0c;HBase本身使用的为javax.ws.rs-api包中的core包&#xff0c;其中有Lin…

【论文阅读】基于卷积神经的端到端无监督变形图像配准

&#x1f4d8;End-to-End Unsupervised Deformable ImageRegistration with a Convolutional NeuralNetwork &#x1f4d5;《基于卷积神经的端到端无监督变形图像配准》 文章目录 摘要 Abstract. 1.导言 Introduction 附录 References未完待续 to be continued ... 摘要 Abstr…

大龄、零基础,想转行做网络安全。怎样比较可行?

随着互联网行业的发展&#xff0c;网络安全问题得到了越来越的重视。国家工信部和发改委对网络安全行业的支持政策也越来越好&#xff0c;致使网络安全的需求越来越大。随着“新基建”在各个领域的深入开展&#xff0c;网络安全产业成为保障“新基建”安全的重要基石。 需求越…

雷电模拟器上使用第一个frida(五)用python实现逆向分析并模拟登陆以及两篇好用文章adb devices出现emulator-5554 offline的解决方案和Frida Hook方法大全

上篇通过hook确定了登录代码的位置&#xff0c;参考雷电模拟器上使用第一个frida&#xff08;四&#xff09;第一个HOOK之抓包-CSDN博客 接下来逆向分析一下&#xff0c;并用python实现其功能&#xff0c;并模拟登陆。 通过抓包分析&#xff0c;其实只要找到riskSecret如何生…

虹科产品丨HK-TrueNAS SCALE可使用公共云存储

HK- TrueNAS SCALE 用户现在可以用 AWS、Azure 和 GCP 的一小部分成本获得公共云存储。 提供NAS软件的虹科 iXsystems公司正在与StorJ合作&#xff0c;利用StorJ的分散式云存储提供全球分布式存储&#xff08;GDS&#xff09;服务&#xff0c;作为主要公共云的低成本替代品。该…

正向代理(流量代理)

文章目录 正向代理与反向代理流量转发工具环境准备reGeorg 正向代理与反向代理 正向代理是客户端和其他所有服务器&#xff08;重点&#xff1a;所有&#xff09;的代理者 反向代理是客户端和所要代理的服务器之间的代理。 流量转发工具 需要放在拿到shell的服务器上可使用 …

WorkPlus企业内部聊天软件,如何保障企业数据和信息的安全性?

大家好&#xff0c;今天我要和大家分享的是企业内部聊天软件&#xff0c;也就是我们常说的IM软件。随着企业内部沟通和协作的需求不断增长&#xff0c;越来越多的企业开始关注如何选择一款最适合自身需求的企业内部聊天软件。在众多选择中&#xff0c;WorkPlus作为领先的品牌&a…

【EI会议征稿】第九届能源资源与环境工程研究进展国际学术会议(ICAESEE 2023)

第九届能源资源与环境工程研究进展国际学术会议&#xff08;ICAESEE 2023&#xff09; 2023 9th International Conference on Advances in Energy Resources and Environment Engineering 第九届能源资源与环境工程研究进展国际学术会议&#xff08;ICAESEE 2023&#xff09;…

java 两个list比较,删除相同的元素

概述 在Java开发中&#xff0c;经常需要比较两个List并删除相同的元素。本文将介绍整个流程&#xff0c;并提供相应的代码示例&#xff0c;帮助新手开发者完成这个任务。 流程 下面是比较两个List并删除相同元素的流程&#xff1a; 代码示例 创建两个List 我们首先需要创建两…

uni-app 瀑布流布局的实现

方式一&#xff1a;使用纯 CSS 实现 使用 flex 布局方式 <!-- 瀑布流布局 --> <template><view class"container"><viewclass"cont-box":style"{ --layout-width: 100 / flowData.column - flowData.columnSpace % }"v-f…

CAS原理与JUC原子类详解

CAS原理与JUC原子类 由于JVM的synchronized重量级锁涉及操作系统&#xff08;如Linux&#xff09;内核态下的互斥锁的使用&#xff0c;其线程阻塞和唤醒都涉及进程在用户态和到内核态的频繁切换&#xff0c;导致重量级锁开销大、性能低。而JVM的synchronized轻量级锁使用CAS&a…

xml的语法

<!-- 1、每一个xml,有且只有一个根标签&#xff0c;所有xml标签必须写在根标签中 2、标签必须要有合闭 3、xml格式是否正确&#xff0c;可以通过浏览器打开xml。来校验xml格式是否正确 4、xml是区别大小写的 5、xml书写标签名时&#xff0c;不要出现空格等特…

JSKarel教学编程机器人使用介绍

JSKarel教学编程机器人使用介绍 为了避免被编程语言固有的复杂性所困扰&#xff0c;有一个被称为卡雷尔&#xff08;Karel&#xff09;机器人的微型世界&#xff08;microworld&#xff09;的简化环境&#xff0c;可以让编程初学者从中学习理解编程的基本概念&#xff0c;而不…

【JAVA-Day44】Java常用类StringBuffer解析

Java常用类StringBuffer解析 Java常用类StringBuffer解析一、什么是StringBuffer类二、StringBuffer类的方法2.1 append方法2.2 insert方法2.3 delete方法2.4 replace方法2.5 reverse方法2.6 toString方法2.7 capacity方法2.8 length方法 三、StringBuffer类的应用场景深入了解…

SGX 研究进展

目录 SGX 应用支持技术研究进展&#xff08;笔记&#xff09;SGX 整体架构SGX安全机制隔离执行认证密封 SGX管理机制SGX 内存管理机制EPC 页驱逐(eviction)SGX SDK SGX 应用现状及瓶颈问题SGX 应用安全防护技术TCB最小化TCB 安全风险分析最小化 TCB 的安全方案 对外接口最少化E…

【Axure高保真原型】3D柱状图_中继器版

今天和大家分享3D柱状图_中继器版的原型模板&#xff0c;图表在中继器表格里填写具体的数据&#xff0c;调整坐标系后&#xff0c;就可以根据表格数据自动生成对应高度的柱状图&#xff0c;鼠标移入时&#xff0c;可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

3.DApp-Metamask登录不了解决方法

题记 当遇到metamask登录不了&#xff0c;加载一直转圈圈&#xff0c;可以用以下的方法解决。 切换网络 切换成Linea Mainnet测试网络&#xff1a; 输入密码 输入登录密码登录metamask 重新选择自定义网络 选择自己本地自定义的网络&#xff1a; 后记 觉得有用可以收藏或点…

【源码分析】Java中的lambda表达式会生成内部类吗?是如何生成的?

文末附结论 分析 以该程序为例子 public class LambdaTest {public static void main(String[] args) {Thread t1 new Thread(() -> {System.out.println("asdwerwerwe");});t1.start();System.out.println("end!!!");} }调用javap -c -p LambdaTest…

C/C++陷阱——临时变量的产生和特性

C/C陷阱——临时变量的产生和特性 在学习C常引用时&#xff0c;有这样一段代码引起了我的注意&#xff1a; int a 1; double& b a;当我编译这段代码时&#xff0c;竟然报错了&#xff1a; 按理来说&#xff0c;初始化引用时不能涉及权限的放大&#xff08;如用const in…

黑群晖自动调整cpu模式

DS918 黑群晖好像是不支持cpu动态频率&#xff0c;导致cpu一直在最高频率运行&#xff0c;导致功耗比较高&#xff0c;但是某些版本的系统不支持设置为自动根据cpu负载动态调整频率&#xff0c;自己写了个脚本&#xff0c;支持自动根据cpu使用率调整cpu模式 脚本下载链接如下 …