一、问题背景与核心需求

需要找到从ab的最优操作序列,使得总花费最小。三种操作的规则为:

  • 操作 1:x → x+1,花费c1
  • 操作 2:x → x-1,花费c2
  • 操作 3:x → x*2,花费c3

例如:若a=7b=9c1=1000c2=1c3=1,最优路径可能是7→5→10→9(先减 2 次到 5,乘 2 到 10,再减 1 到 9),总花费2*c2 + c3 + c2,比直接加 2 次(2*c1)更便宜。

我们发现,路径的选择是非常多种多样的,无法靠人力去完整的思考有哪些可能。 

二、算法选择与设计

1. 问题转化为图论模型

将每个整数视为节点,每种操作视为有向边(边权为操作花费)。例如:

  • 节点xx+1有一条边,权值c1
  • 节点xx-1有一条边,权值c2
  • 节点x2x有一条边,权值c3

问题转化为:在该图中寻找从节点a到节点b最短路径(总权值最小)。

Dijkstra 算法求解单源最短路径

2. 为何用 Dijkstra 算法?

Dijkstra 算法#图论-CSDN博客

  • 所有操作的花费(边权)均为非负数(题目隐含c1,c2,c3≥0),无负权边;
  • Dijkstra 算法适合求解单源最短路径(从ab),且在非负权图中效率高。
3. 搜索范围的确定(limit = max(a,b)*2

需要限制节点范围,否则节点可能无限大(如多次乘 2)。选择max(a,b)*2的原因:

  • 最优路径可能需要 “超过b再返回”,例如a=7→5→10(>9)→9b=9);
  • max(a,b)*2足够覆盖此类情况,避免遗漏最优路径。

三、代码细节解析

1. 特殊情况处理(a > b

a > b时,加 1 或乘 2 会使a更大,远离b,最优策略只能是持续减 1,因此直接计算花费:(a - b) * c2

2. Dijkstra 算法实现
  • 距离数组distdist[v]表示从av的最小花费,初始化为inf(无穷大),dist[a] = 0(起点花费为 0)。
  • 优先队列pq:小根堆(按花费升序),存储(当前花费, 节点),每次取出花费最小的节点处理。
  • 邻接点生成:对当前节点u,生成三个邻接点:
    • u+1(花费c1);
    • u-1(花费c2);
    • u*2(花费c3)。
  • 松弛操作:若通过u到达v的花费(curdist + w)小于已知最小花费dist[v],则更新dist[v]并加入队列。
3. 终止条件

当队列中取出的节点为b时,说明已找到ab的最短路径,可直接退出循环。

四、示例说明

a=7b=9c1=1000c2=1c3=1为例:

  • 节点范围limit = max(7,9)*2 = 18,覆盖可能的路径节点(如 10)。
  • 初始dist[7] = 0,队列加入(0,7)
  • 处理节点 7 时,邻接点为 8(花费 1000)、6(花费 1)、14(花费 1),更新对应dist并加入队列。
  • 后续处理节点 6(花费 1),邻接点 5(花费 1+1=2)、7(已处理)、12(花费 1+1=2)。
  • 处理节点 5(花费 2),邻接点 6(花费更高,跳过)、4(花费 3)、10(花费 2+1=3)。
  • 处理节点 10(花费 3),邻接点 11(花费 3+1000)、9(花费 3+1=4),此时dist[9] = 4,找到目标,退出。

最终输出4,符合最优路径花费。

五、码

 

#include <bits/stdc++.h>
using namespace std;
using ll = long long;const ll inf = 0x3f3f3f3f3f3f3f3f;  // 定义无穷大// 解决从数字a变为b的最小花费问题
void solve() {ll a, b, c1, c2, c3;cin >> a >> b >> c1 >> c2 >> c3;// 当a大于b时,只能不断减1,直接计算花费if (a > b) {cout << (a - b) * c2 << '\n';return;}// 确定搜索的上限:覆盖可能需要超过b再返回的情况ll limit = max(a, b) * 2;// 初始化距离数组,dist[x]表示从a到x的最小花费vector<ll> dist(limit + 1, inf);// 优先队列,按花费从小到大排序priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<>> pq;// 起点a的花费为0dist[a] = 0;pq.emplace(0, a);// Dijkstra算法主循环while (!pq.empty()) {// 取出当前花费最小的节点auto [curdist, u] = pq.top();pq.pop();// 到达目标值b,输出结果并终止if (u == b)break;// 跳过已处理的过时路径if (curdist > dist[u])continue;// 生成三种操作对应的邻接点和边权vector<pair<ll, ll>> adj = {{u + 1, c1},  // 操作1:加1,花费c1{u - 1, c2},  // 操作2:减1,花费c2{u * 2, c3}   // 操作3:乘2,花费c3};// 遍历所有邻接点,进行松弛操作for (auto [v, w] : adj) {// 检查节点范围并更新最短路径if (1 <= v && v <= limit) {ll newdist = curdist + w;if (newdist < dist[v]) {dist[v] = newdist;pq.push({newdist, v});}}}}// 输出到达b的最小花费cout << dist[b] << '\n';
}int main() {// 优化输入输出效率ios::sync_with_stdio(false);cin.tie(nullptr);ll t = 1;cin >> t;while (t--)solve();
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地项目提交到git教程

创建远程仓库 登录 GitHub&#xff0c;点击右上角 New repository。 填写仓库名称&#xff08;如 my-project&#xff09;、描述&#xff0c;选择公开 / 私有。 不要初始化 README、.gitignore 或 LICENSE&#xff08;保持空仓库&#xff09;&#xff0c;点击 Create repositor…

Linux 密码生成利器:pwgen 命令详解

往期好文&#xff1a;统信 UOS 运行 Windows 应用新利器&#xff01;彩虹虚拟化软件 V3.2 全新上线&#xff0c;限时30天免费体验 在日常运维、安全测试、用户管理等场景中&#xff0c;随机密码的生成是一项常见需求。为了避免人工设置密码带来的重复性弱密码问题&#xff0c;…

Qt 应用程序入口代码分析

Qt 应用程序入口代码分析 这段代码是 Qt GUI 应用程序的标准入口点&#xff0c;相当于 Qt 程序的"心脏"。让我详细解释每一部分的作用&#xff1a; int main(int argc, char *argv[]) {// 1. 创建 Qt 应用程序对象QApplication a(argc, argv);// 2. 创建主窗口对象Wi…

基于springboot+mysql的中小型医院网站(源码+论文+开题报告)

一、开发环境 Java技术 描述&#xff1a;Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行榜上总是前三。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任何地方都可以运行。除此之外&#xff0c;它还拥有简单的语法和实用的类库&#xff0c;让…

【Docker基础】Docker-compose常用命令实践(三):镜像与配置管理

目录 前言 1 镜像与配置管理概述 1.1 核心概念解析 2 镜像构建命令详解 2.1 构建镜像&#xff08;build命令&#xff09; 2.2 基本语法 2.3 常用选项 2.4 构建过程流程 2.5 实际应用案例 3 配置验证命令详解 3.1 验证配置&#xff08;config命令&#xff09; 3.2 基…

Android 实例 - 分页器封装实现(上一页按钮、下一页按钮、当前页码 / 总页数、每页条数、总记录数)

一、需求分页器需要包含&#xff1a;【上一页按钮】、【下一页按钮】、【当前页码 / 总页数】、【每页条数】、【总记录数】点击【上一页按钮】&#xff0c;渲染上一页的数据&#xff0c;如果当前页码为第一页&#xff0c;则禁用【上一页按钮】点击【下一页按钮】&#xff0c;渲…

从代码学习深度强化学习 - SAC PyTorch版

文章目录 前言 SAC处理连续动作空间问题 (Pendulum-v1) 核心代码实现 **工具函数与环境初始化** **ReplayBuffer、网络结构与SAC算法** **训练与结果** SAC处理离散动作空间问题 (CartPole-v1) 核心代码实现 **工具函数与环境初始化** **ReplayBuffer、网络结构与SAC算法 (离散…

物联网安装调试-温湿度传感器

以下为温湿度传感器在物联网安装调试中的全流程技术指南,涵盖选型、安装、调试及故障排查,结合工业/农业/家居三大场景实操要点: 一、传感器选型核心参数表 参数 工业场景 农业大棚 智能家居 选型建议 精度 0.5℃/1.5%RH 1℃/3%RH 1℃/5%RH 工业级首选Sensirion SHT3x系列 防…

MySQL 核心知识点梳理(1)

目录 1.什么是数据库? 关系型数据库 非关系型数据库 2.Mysql出现性能差的原因? 3.MySQL的内联,左外联,右外连接的区别 4.为什么要有三大范式 建表需要考虑的问题? char和varchar的区别 blob和text的区别? DATETIME和TIMESTAMP的区别 in和exists的区别 null值陷 …

Word快速文本对齐程序开发经验:从需求分析到实现部署

在日常办公中&#xff0c;文档排版是一项常见但耗时的工作&#xff0c;尤其是当需要处理大量文本并保持格式一致时。Microsoft Word作为最流行的文档处理软件之一&#xff0c;虽然提供了丰富的排版功能&#xff0c;但在处理复杂的文本对齐需求时&#xff0c;往往需要重复执行多…

力扣面试150(34/150)

7.20 242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词 我的思路&#xff1a; 遍历s到一个sMap&#xff0c;字母次数的方式遍历t&#xff0c;判断t中的char是否在sMap当中&#xff0c;如果在的话次数-1&#xff0c;判…

软件工程:可行性分析的任务及报告

简介 本博客围绕软件工程中的第一关——“可行性分析的任务及报告”展开&#xff0c;详细解析了可行性分析的基本概念、分析任务、四类可行性&#xff08;技术、经济、操作、社会&#xff09;以及可行性分析报告的结构与撰写要点。通过丰富的理论基础与图示支持&#xff0c;帮…

STM32与树莓派通信

STM32 与树莓派&#xff08;Raspberry Pi&#xff09;的通信常见方案及实现步骤&#xff1a;1. UART 串口通信&#xff08;最简单&#xff09;适用场景&#xff1a;短距离、低速数据交换&#xff08;如传感器数据、调试信息&#xff09;。 硬件连接&#xff1a;STM32引脚树莓派…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 数据持久化到Mysql

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解数据持久化到Mysql 视频在线地址&#xff…

【Java EE】多线程-初阶-Thread 类及常见方法

多线程-初阶2. Thread 类及常⻅⽅法2.1 Thread 的常⻅构造⽅法2.2 Thread 的⼏个常⻅属性2.3 启动⼀个线程 - start()2.4 中断⼀个线程2.5 等待⼀个线程 - join()2.6 获取当前线程引⽤2.7 休眠当前线程本节⽬标• 认识多线程• 掌握多线程程序的编写• 掌握多线程的状态• 掌握…

LVS技术知识详解(知识点+相关实验部署)

目录 1.1 LVS简介 1.2 LVS体系结构 1.3 LVS相关术语 1.4 LVS工作模式 1.5 LVS工作原理 1.6 LVS调度算法 2.LVS相关实验部署 2.1 lvs软件相关信息 2.1.1 ipsadm常见参数 2.1.2 试例 2.2 LVS部署NAT模式 2.2.1 实验环境 2.2.2 实验步骤 2.2.2.1 实验基础环境 2.2.…

芋道导入逻辑

一、代码 PostMapping("/import")Operation(summary "导入用户")Parameters({Parameter(name "file", description "Excel 文件", required true),Parameter(name "updateSupport", description "是否支持更新&a…

gradle7.6.1+springboot3.2.4创建微服务工程

目录 一、创建主工程cloud-demo并删除src目录 二、创建子工程user-service/order-service 三、更改父工程build.gradle文件 四、子工程使用mybatis框架 五、子工程使用mybatis-plus框架 六、相关数据库创建 七、最终目录结构 一、创建主工程cloud-demo并删除src目录 二、…

电脑windows系统深度维护指南

&#x1f5a5;️ 电脑系统全方位维护指南 预防故障 提升性能 延长寿命 &#x1f50d; 引言&#xff1a;为什么需要系统维护&#xff1f; 电脑如同汽车&#xff0c;定期保养可避免&#xff1a; ✅ 突发蓝屏死机 ✅ 系统卡顿崩溃 ✅ 硬件过早损坏 ✅ 数据丢失风险 本指南提供…

字节内部流传的数据分析手册

之前2领导整理内部分享的&#xff0c;所以很多内部业务的分析&#xff0c;比如工作中怎么落地、怎么推进。(数据都是脱敏的哈) **里面的内容都偏应用&#xff0c;比如产品迭代怎么做数据评估、用户增长靠什么指标拆解、AB实验怎么设计、运营活动怎么闭环。**数据分析都是很实际…