贪心算法求解汽车加油问题
一、问题描述
一辆汽车加满油后可以行驶 n km。在前往目的地的途中,有多个加油站。我们的目标是设计一个有效的算法,确定汽车应该在哪些加油站停靠加油,以使得沿途的加油次数最少。
二、输入输出形式
算法的输入包括两部分:第一行有两个正整数 n 和 k,分别表示汽车加满油后的行驶里程和加油站的数量;第二行包含 k+1 个整数,表示第 k 个加油站与第 k-1 个加油站之间的距离。其中,第 0 个加油站代表出发地(汽车已在此加满油),第 k+1 个加油站代表目的地。
输出则为最少加油次数以及加油站点的编号。如果无法到达目的地,则输出“No Solution”。
例如,样例输入为:
7 7
1 3 5 2 6 3 5 5
样例输出为:
5
2 4 5 6 7
三、算法设计
(一)贪心策略选择
贪心算法在每一步选择中都采取当前状态下最优的策略,希望通过局部最优选择来达到全局最优解。在汽车加油问题中,贪心策略是在每次加油时,尽可能地驶向最远的加油站。这样可以减少加油次数,因为我们每次都尽可能地延长行驶距离。
具体来说,每次到达一个加油站后,我们会计算从该加油站出发,汽车在不加油的情况下能到达的最远加油站。然后选择这个最远的加油站作为下一个加油点。如果无法到达下一个加油站,则输出“No Solution”。
(二)算法步骤
-
初始化当前位置为出发地(第 0 个加油站),加油次数为 0,加油站点列表为空。
-
循环执行以下操作:
-
从当前位置开始,计算汽车在不加油的情况下能行驶的最大距离所能到达的最远加油站。
-
如果该最远加油站已经到达或超过了目的地,则结束循环。
-
如果无法到达任何更远的加油站(即汽车无法继续前行),则输出“No Solution”并结束算法。
-
否则,增加加油次数,将最远加油站添加到加油站点列表中,并将当前位置更新为该最远加油站。
-
-
输出最少加油次数和加油站点列表。
四、代码实现
以下是使用 C++ 实现的代码:
#include <iostream>
#include <vector>
using namespace std;int main() {int n, k;cin >> n >> k;vector<int> dist(k + 1);for (int i = 0; i <= k; ++i) {cin >> dist[i];}int current_pos = 0;int count = 0;vector<int> stops;while (true) {int sum_dist = 0;int max_reach = current_pos;for (int i = current_pos; i <= k; ++i) {sum_dist += dist[i];if (sum_dist > n) {break;}max_reach = i + 1;}if (max_reach >= k + 1) {break;}if (max_reach == current_pos) {cout << "No Solution" << endl;return 0;}count++;stops.push_back(max_reach);current_pos = max_reach;}cout << count << endl;for (size_t i = 0; i < stops.size(); ++i) {if (i > 0) {cout << " ";}cout << stops[i];}cout << endl;return 0;
}
(一)代码解读
-
输入读取:首先读取汽车加满油后的行驶里程 n 和加油站数量 k。然后读取 k+1 个整数,表示相邻加油站之间的距离。
-
初始化变量:当前位置 current_pos 初始化为 0(出发地),加油次数 count 初始化为 0,加油站点列表 stops 初始化为空。
-
循环计算最远加油站:
-
在每次循环中,从当前位置开始,计算汽车在不加油的情况下能行驶的最大距离所能到达的最远加油站 max_reach。
-
如果 max_reach 已经到达或超过了目的地(k+1 个加油站中的第 k+1 个),则跳出循环。
-
如果 max_reach 没有变化(即汽车无法继续前行),输出“No Solution”并结束程序。
-
否则,增加加油次数,将 max_reach 添加到加油站点列表中,并将当前位置更新为 max_reach。
-
-
输出结果:输出最少加油次数和加油站点列表。
(二)算法复杂度分析
该算法的时间复杂度为 O(k^2)。在最坏情况下,对于每个加油站,我们都需要遍历后续的所有加油站来找到最远可达的加油站。空间复杂度为 O(k),用于存储加油站点列表。
五、算法性能分析
(一)优点
-
简单易懂:贪心算法的思路直观,易于实现和理解。
-
高效性:在大多数情况下,贪心算法能够快速找到最优解,特别适用于加油站数量较多的场景。
(二)缺点
-
局部最优不等于全局最优:贪心算法只能保证在每一步选择当前最优解,但无法保证最终解一定是全局最优解。然而,在汽车加油问题中,贪心策略能够得到正确的最少加油次数。
-
对输入数据的依赖性:如果输入数据不符合实际情况(例如,加油站分布过于密集或稀疏),贪心算法可能无法找到最优解或输出“No Solution”。
六、改进建议
-
数据预处理:在实际应用中,可以对加油站数据进行预处理,例如去除距离过近的加油站或添加额外的约束条件(如油价差异)。
-
结合其他算法:对于更复杂的场景,可以考虑将贪心算法与其他算法(如动态规划)结合使用,以提高解的质量和鲁棒性。
七、实际应用拓展
汽车加油问题不仅在日常生活中有广泛应用,也可以拓展到其他领域,如无人机续航规划、物流运输路线优化等。通过合理应用贪心算法,我们可以在各种资源受限的场景下实现高效的目标达成。
总之,贪心算法为解决汽车加油问题提供了一种高效、简洁的方法。通过合理选择贪心策略,我们能够在大多数情况下找到最优解,满足实际应用需求。
相关文章:
贪心算法求解汽车加油问题
一、问题描述 一辆汽车加满油后可以行驶 n km。在前往目的地的途中,有多个加油站。我们的目标是设计一个有效的算法,确定汽车应该在哪些加油站停靠加油,以使得沿途的加油次数最少。 二、输入输出形式 算法的输入包括两部分:第一…...
JVM Full GC 频繁问题排查、优化及解决方案
引言 在Java应用程序中,JVM(Java虚拟机)通过垃圾回收机制自动管理内存,确保不再使用的对象能够被及时清理和释放。虽然垃圾回收在大多数情况下运行顺利,但当Full GC频繁发生时,它会严重影响应用性能&#x…...

rsync服务的搭建
目录 一、rsync介绍 rsync的安装 二、rsync的语法 三、rsync命令使用 1. 本机同步 2. 远程同步 四、rsync作为服务使用 1、尝试启动rsync程序 2、rsync的配置文件介绍 注意事项: 3. rsyncinotify实时同步 3.依赖服务托管xinetd(CentOS 6中rs…...
JDK21深度解密 Day 8:Spring Boot 3与虚拟线程整合
【JDK21深度解密 Day 8】Spring Boot 3与虚拟线程整合 引言:Spring Boot 3遇上JDK21虚拟线程 在本系列的第8天,我们将聚焦于Spring Boot 3与JDK21虚拟线程的整合实践。作为全网首套完整的JDK21特性解析,我们不仅会探讨虚拟线程如何颠覆传统Java并发模型,还会通过完整的Sp…...

vscode 配置 QtCreat Cmake项目
1.vscode安装CmakeTool插件并配置QT中cmake的路径,不止这一处 2.cmake生成器使用Ninja(Ninja在安装QT时需要勾选),可以解决[build] cc1plus.exe: error: too many filenames given; type ‘cc1plus.exe --help’ for usage 编译时…...
排序算法-归并排序与快速排序
归并排序与快速排序 快速排序是利用的递归思想:选取一个基准数,把小于基准数的放左边 大于的放右边直到整个序列有序 。快排分割函数 O(lognn), 空间 :没有额外开辟新的数组但是递归树调用函数会占用栈内存 O(logn) 。 归并排序:在递归返回的…...

HTML实现端午节主题网站:龙舟争渡,凭吊祭江诵君赋。
名人说:龙舟争渡,助威呐喊,凭吊祭江诵君赋。——苏轼《六幺令天中节》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、项目概览:传统与现代的技术碰撞1. 核心特…...

uniapp uni-id 如果是正式项目,需自行实现发送邮件的相关功能
(3) 使用云对象sendEmailCode 发送邮箱验证码,报错送邮箱验证码失败 Error: 已启动测试模式,直接使用:123456作为邮箱验证码即可。 如果是正式项目,需自行实现发送邮件的相关功能 - DCloud问答 uni-id 没有实现邮箱验证码逻辑&am…...
Spring boot 策略模式
public abstract class Node {/*** 执行** param a* param b* return*/public abstract Integer execute(int a, int b); }package my.node;import org.springframework.stereotype.Component;Component("exec") public class ExecNode extends Node {Overridepublic…...
websocket在vue中的使用步骤,以及实现聊天
一、WebSocket集成步骤 连接初始化 在Vue组件中创建WebSocket实例,建议在mounted生命周期中执行: data() {return {socket: null,messages: []} }, mounted() {this.socket new WebSocket(wss://your-server-endpoint); }事件监听配置 连接成…...

C++学习-入门到精通【12】文件处理
C学习-入门到精通【12】文件处理 目录 C学习-入门到精通【12】文件处理一、文件和流二、创建顺序文件三、从顺序文件读取数据文件定位指针对之前的程序进行修改:贷款查询程序 四、更新顺序文件五、随机存取文件1.创建随机存取文件2.修改程序:贷款处理程序…...
第十一篇:MySQL 在分布式系统中的一致性保障与中间件实践
随着微服务和分布式架构的发展,单点数据库早已无法满足系统的横向扩展需求。本篇聚焦 MySQL 在分布式系统中的一致性保障机制,以及相关中间件的使用策略与实战经验。 一、一致性问题的由来 在 单机 MySQL 环境 中,事务具有原子性、隔离性&am…...
Java中如何枚举正则表达式捕获组的名字
在使用正则表达式在匹配文本时,除了可以通过表达式捕获命中的文本串外,还可以对捕获的文本串进行命名。尤其是在解析日志的场景中,经常会被用到。表达式如下: \<(?<pri>\d)\>(?<time>.*) (?<host>\S)…...
matlab实现图像压缩编码
一、基于DCT的JPEG压缩(有损) 1. 核心步骤 图像分块:将图像划分为88的小块。离散余弦变换(DCT):对每个块进行DCT变换。量化:对DCT系数进行量化以减少高频信息。熵编码:使用哈夫曼或…...
如何排查Redis单个Key命中率骤降?
问题现象 Redis整体命中率98%,但监控发现特定Key(如user:1000:profile)的命中率从99%骤降至40%,引发服务延迟上升。 排查步骤 1. 确认现象与定位Key // 通过Redis监控工具获取Key指标 public void monitorKey(String key) {Je…...

记一次 Starrocks be 内存异常宕机
突发性 be 内存飙高,直至被系统 kill 掉,be 内存如下:其中 starrocks_be_update_mem_bytes 指标打满,重启也是如此 [rootlocalhost bin]# curl -XGET -s http://192.168.1.49:8040/metrics | grep "^starrocks_be_.*_mem_b…...
Spring Boot 读取.env文件获取配置
Spring Boot 读取.env文件获取配置 在Resouce 目录下创建.env文件 # DEEP SEEK TOKEN DEEP_SEEK_TOKENyour_deep_seek_key # 阿里云百炼 TOKEN ALI_BAILIAN_TOKENyour_ali_bailian_keyyml引入.env文件 spring:config:import: optional:classpath:.env[.properties]使用.env文…...

LangChain-结合GLM+SQL+函数调用实现数据库查询(一)
业务流程 实现步骤 1. 加载数据库配置 在项目的根目录下创建.env 文件,设置文件内容: DB_HOSTxxx DB_PORT3306 DB_USERxxx DB_PASSWORDxxx DB_NAMExxx DB_CHARSETutf8mb4 加载环境变量,从 .env 文件中读取数据库配置信息 使用 os.getenv…...
python训练营打卡第41天
简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 → Batch…...
1.3HarmonyOS NEXT统一开发范式与跨端适配:开启高效跨设备应用开发新时代
HarmonyOS NEXT统一开发范式与跨端适配:开启高效跨设备应用开发新时代 在HarmonyOS NEXT的技术体系中,统一开发范式与跨端适配是两大关键特性,它们为开发者打破了设备边界,极大地提升了开发效率与应用体验。本章节将深入探讨方舟…...
麒麟v10,arm64架构,编译安装Qt5.12.8
Window和麒麟x86_64架构,官网提供安装包,麒麟arm64架构的,只能自己用编码编译安装。 注意,“桌面”路径是中文,所以不要把源码放在桌面上编译。 1. 下载源码 从官网下载源码:https://download.qt.io/arc…...
ArcGIS Pro 3.4 二次开发 - 布局
环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 布局1 布局工程项1.1 引用布局工程项及其关联的布局1.2 在新视图中打开布局工程项1.3 激活已打开的布局视图1.4 引用活动布局视图1.5 将 pagx 导入工程1.6 移除布局工程项1.7 创建并打开一个新的基本布局1.8 使用修改后的CIM创建新…...
基于随机函数链接神经网络(RVFL)的锂电池健康状态(SOH)预测
基于随机函数链接神经网络(RVFL)的锂电池健康状态(SOH)预测 一、RVFL网络的基本原理与结构 随机向量功能链接(Random Vector Functional Link, RVFL)网络是一种单隐藏层前馈神经网络的随机化版本,其核心特征在于输入层到隐藏层的权重随机生成且固定,输出层权重通过最…...
爱其实很简单
初春时,元元买来两只芙蓉鸟。一只白色的,是雄鸟;另一只黄色的,是雌鸟。 每天清晨日出之前,雄鸟便开始“啁啾——啁啾”地啼鸣,鸣声清脆婉转,充满喜悦,仿佛在迎接日出,又…...

2025年渗透测试面试题总结-匿名[校招]安全工程师(甲方)(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 匿名[校招]安全工程师(甲方) 1. 介绍自己熟悉的渗透领域 2. 编程语言与开发能力 3. 实习工作内容与流程 …...

PySide6 GUI 学习笔记——常用类及控件使用方法(地址类QUrl)
文章目录 地址类QUrl主要功能URL 格式介绍常见 scheme(协议)类型QUrl 类常用方法常用方法示例典型应用场景 地址类QUrl QUrl 是 PySide6.QtCore 模块中的一个类,用于处理和操作 URL(统一资源定位符)。它可以解析、构建…...

任务23:创建天气信息大屏Django项目
任务描述 知识点: Django 重 点: Django创建项目Django视图函数Django路由Django静态文件Django渲染模板 内 容: 使用PyCharm创建大屏项目渲染大屏主页 任务指导 1. 使用PyCharm创建大屏项目。 创建weather项目配置虚拟环境创建ch…...
数学分析——一致性(均匀性)和收敛
目录 1. 连续函数 1.1 连续函数的定义 1.2 连续函数的性质 1.2.1 性质一 1.2.2 性质二 1.2.3 性质三 1.2.4 性质四 2. 一致连续函数 2.1 一致连续函数的定义 2.2 一致连续性定理(小间距定理)(一致连续函数的另一种定义) 2.3 一致连续性判定法 2.4 连…...

Flutter GridView网格组件
目录 常用属性 GridView使用配置 GridView.count使用 GridView.extent使用 GridView.count Container 实现列表 GridView.extent Container 实现列表 GridView.builder使用 GridView网格布局在实际项目中用的也是非常多的,当我们想让可以滚动的元素使用矩阵…...

【深度学习】18. 生成模型:Variational Auto-Encoder(VAE)详解
Variational Auto-Encoder(VAE)详解 本节内容完整介绍 VAE 的模型结构、优化目标、重参数化技巧及其生成机制。 回顾:Autoencoder(自编码器) Autoencoder 是一种无监督学习模型,旨在从未标注的数据中学习压…...