【大根堆】【C++算法】871 最低加油次数
作者推荐
【动态规划】【map】【C++算法】1289. 下降路径最小和 II
本文涉及知识点
大根堆 优先队列
LeetCode:871最低加油次数
汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。
 沿途有加油站,用数组 stations 表示。其中 stations[i] = [positioni, fueli] 表示第 i 个加油站位于出发位置东面 positioni 英里处,并且有 fueli 升汽油。
 假设汽车油箱的容量是无限的,其中最初有 startFuel 升燃料。它每行驶 1 英里就会用掉 1 升汽油。当汽车到达加油站时,它可能停下来加油,将所有汽油从加油站转移到汽车中。
 为了到达目的地,汽车所必要的最低加油次数是多少?如果无法到达目的地,则返回 -1 。
 注意:如果汽车到达加油站时剩余燃料为 0,它仍然可以在那里加油。如果汽车到达目的地时剩余燃料为 0,仍然认为它已经到达目的地。
 示例 1:
 输入:target = 1, startFuel = 1, stations = []
 输出:0
 解释:可以在不加油的情况下到达目的地。
 示例 2:
 输入:target = 100, startFuel = 1, stations = [[10,100]]
 输出:-1
 解释:无法抵达目的地,甚至无法到达第一个加油站。
 示例 3:
 输入:target = 100, startFuel = 10, stations = [[10,60],[20,30],[30,30],[60,40]]
 输出:2
 解释:
 出发时有 10 升燃料。
 开车来到距起点 10 英里处的加油站,消耗 10 升燃料。将汽油从 0 升加到 60 升。
 然后,从 10 英里处的加油站开到 60 英里处的加油站(消耗 50 升燃料),
 并将汽油从 10 升加到 50 升。然后开车抵达目的地。
 沿途在两个加油站停靠,所以返回 2 。
 参数:
 1 <= target, startFuel <= 109
 0 <= stations.length <= 500
 1 <= positioni < positioni+1 < target
 1 <= fueli < 109
分析
加油站的位置已经按升序排序。
 iCan 记录加油i次后,能到达的最远位置。i 取值区间[0,stations.length]
 第i+1次加油,一定是iPreCan(第i次加油的iCan)能到达且没有加油,油量最大的加油站。
 如果没有到达终点,且无油可加返回-1。
代码
核心代码
class Solution {
public:int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) {int iCan = startFuel;priority_queue<int> canAdd;int j = 0;for (int i = 0; i < stations.size(); i++){if (iCan >= target){return i;}//canAdd能加油的加油站while ((j < stations.size()) && (stations[j][0] <= iCan)){canAdd.emplace(stations[j++][1]);}if (canAdd.empty()){return -1;}iCan += canAdd.top();canAdd.pop();}return (iCan >= target) ? stations.size() : -1;}
};
测试用例
template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{	int target,  startFuel;vector<vector<int>> stations;{Solution sln;target = 1, startFuel = 1, stations = {};auto res = sln.minRefuelStops(target, startFuel, stations);Assert(res, 0);}{Solution sln;target = 100, startFuel = 1, stations = { {10,100} } ;auto res = sln.minRefuelStops(target, startFuel, stations);Assert(res, -1);}{Solution sln;target = 100, startFuel = 10, stations = { {10, 60},{20, 30},{30, 30},{60, 40} };auto res = sln.minRefuelStops(target, startFuel, stations);Assert(res, 2);}	{Solution sln;target = 100, startFuel = 50, stations = { {25, 25},{50, 50} };auto res = sln.minRefuelStops(target, startFuel, stations);Assert(res, 1);}}
2023年1月第一版
class Solution {
 public:
 int minRefuelStops(int target, int startFuel, vector<vector>& stations) {
 std::unordered_map<int,int> preDp;
 preDp[0] = startFuel;
 int iPrePos = 0;
 for (auto& v : stations)
 {
 std::unordered_map<int, int> dp;
 for (auto& pre : preDp)
 { 
 const int iHasFuel = pre.second - (v[0] - iPrePos);
 if (iHasFuel < 0 )
 {
 continue;
 }
 Add(dp, pre.first, iHasFuel);
 Add(dp, pre.first+1, iHasFuel + v[1]);
 }
 preDp.swap(dp);
 iPrePos = v[0];
 }
 int iMinNum = INT_MAX;
 for (auto& pre : preDp)
 {
 const int iHasFuel = pre.second - (target - iPrePos);
 if (iHasFuel < 0)
 {
 continue;
 }
 iMinNum = min(iMinNum, pre.first);
 }
 return (INT_MAX == iMinNum) ? -1 : iMinNum;
 }
 void Add(std::unordered_map<int, int>& dp, int iNum, int iFuel)
 {
 iFuel = min(iFuel, 1000 * 1000 * 1000);
 auto it = dp.find(iNum);
 if (dp.end() == it)
 {
 dp[iNum] = iFuel;
 }
 else
 {
 it->second = max(it->second, iFuel);
 }
 }
 };
2023年1月 第二版
class Solution {
 public:
 int minRefuelStops(int target, int startFuel, vector<vector>& stations) { 
 m_iFuel = startFuel;
 for (auto& v : stations)
 {
 Add(v[0]);
 if (m_iFuel < v[0])
 {
 return -1;
 }
 m_qFuel.push(v[1]); 
 } 
 Add(target);
 if (m_iFuel < target)
 {
 return -1;
 }
 return stations.size() - m_qFuel.size();
 }
 void Add(int iNeedFuel)
 {
 while (m_qFuel.size() && (m_iFuel < iNeedFuel))
 {
 m_iFuel += m_qFuel.top();
 m_qFuel.pop();
 }
 } 
 std::priority_queue m_qFuel;
 int m_iFuel; 
 };
2023年 8月版
class Solution {
 public:
 int minRefuelStops(int target, int startFuel, vector<vector>& stations) {
 stations.emplace_back(vector{target, 0});
 int iRet = 0;
 std::multiset setCanAdd;
 int iHas = startFuel;
 for (const auto& v : stations)
 {
 while (setCanAdd.size() && (iHas < v[0]))
 {//油不够,需要加油
 iHas += *setCanAdd.rbegin();
 setCanAdd.erase(std::prev(setCanAdd.end()));
 iRet++;
 }
 if (iHas < v[0])
 {
 return -1;
 }
 setCanAdd.emplace(v[1]);
 }
 return iRet;
 }
 };

扩展阅读
视频课程
有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
 https://edu.csdn.net/course/detail/38771
如何你想快
速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
 https://edu.csdn.net/lecturer/6176
相关
下载
想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
 https://download.csdn.net/download/he_zhidan/88348653
| 我想对大家说的话 | 
|---|
| 闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。 | 
| 子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。 | 
| 如果程序是一条龙,那算法就是他的是睛 | 
测试环境
操作系统:win7 开发环境: VS2019 C++17
 或者 操作系统:win10 开发环境: VS2022 C++17
 如无特殊说明,本算法用**C++**实现。

相关文章:
 
【大根堆】【C++算法】871 最低加油次数
作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 大根堆 优先队列 LeetCode:871最低加油次数 汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,用数组 stations 表示。其中 statio…...
 
SpringBoot的自动装配原理
一、SpringBootConfiguration注解的作用 SpringBootApplication注解是SpringBoot项目的核心注解,加在启动引导类上。点击进去可以发现SpringBootApplication注解是一个组合注解。其中SpringBootConfiguration和EnableAutoConfiguration是由Spring提供的,剩下的注解是由JDK提供的…...
嵌入式驱动开发需要会哪些技能?
嵌入式驱动开发是指在嵌入式系统中编写驱动程序,实现设备与计算机之间的通信。嵌入式驱动开发是指编写设备驱动程序,实现设备与计算机之间的通信。以下是一些嵌入式驱动开发的具体操作方法: 1)了解硬件设备结构:在进行嵌入式驱动…...
 
Leetcode:二分搜索树层次遍历
题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例: 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,…...
【fabric.js】toDataURL 性能问题、优化
必要解释:最好看完。。省流版的话,toDataURL 的 multiplier参数不要设置超过500; 情景:在做某些功能的时候涉及到图形的预览,预览的时候是导出为40*40 像素的图片,当碰到某些图形非常小的时候,…...
 
基于Grafana+Prometheus搭建可视化监控系统实践
基本介绍 Grafana:一个监控仪表系统,可以根据提供的监控数据,生产可视化仪表盘,同时也具有告警通知功能。这里的监控数据来源,目前主要以Prometheus为主(也支持其它数据源),每次展现…...
 
选择排序(堆排序和topK问题)
选择排序 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。 如果我们用扑克牌来举例,那么选择排序就像是提前已经把所有牌都摸完了,而再进行牌…...
webpack tree shaking 摇树原理
Tree-shaking 是指在打包过程中通过静态分析,识别并删除未使用的代码,以减小最终输出文件的大小。Webpack 通过内置的 UglifyJS 插件或者 Terser 插件来实现 Tree-shaking。下面是简要的 webpack Tree-shaking 的原理: 标记未使用的代码&…...
开源模型应用落地-业务整合篇(三)
一、前言 在之前的两篇文章中,我们学习了如何构建基本的即时消息(IM)功能。今天,我们将进一步将IM模块与AI服务进行连接,实现用户提问并由模型进行回答,最后将结果展示在用户界面上。 二、术语 2.1. Spring Boot 是一个用于快速构建基于Spring框架的Java应用程序的开源框…...
 
js打地鼠
文章目录 1实现效果2代码实现 1实现效果 游戏难度:简单,一般,困难,噩梦(控制setInterval的time参数) 按钮功能:结束(可以通过修改gameScore的值来修改判定结束的分数)&am…...
 
计算机网络体系架构认知--网络协议栈
文章目录 一.计算机网络分层架构各协议层和计算机系统的联系从整体上理解计算机网络通信计算机网络通信的本质 二.Mac地址,IP地址和进程端口号三.局域网通信与跨局域网通信局域网通信跨局域网通信全球互联的通信脉络 四.网络编程概述 一.计算机网络分层架构 实现计算机长距离网…...
 
Ubuntu 22.04 安装tomcat
tomcat是常用的Java服务容器,这篇文章我们就来讲讲如何安装它。 更新软件包 首先是更新软件包,这是最常规的操作 sudo apt update 然后是开始安装,不多一会就可以安装好了 sudo apt install tomcat9 然后看一下状态 sudo systemctl status tomcat9 发现虽然启动了,但…...
记录:Ubuntu 18.04 X86 上通过CMake 指定编译器工具链交叉编译。
最好是通过 cmake 命令行来设置,要不然你只有在 CMakeFiles.txt 里面自己写判断语句了。 要用 cmake 交叉编译,必须设置连接器,要不然会使用当前系统的 ld,就是 /usr/bin/ld。 但是其它平台是不会ld上的,elf格式都不…...
 
requests,js逆向练习
自上而下排除jquery源码,点进去utils 发现第一次请求是getTime 再次运行此断点才是登录,这个时候密码已经被加密了 查看上级js页面,发现加密函数 进去看函数加密过程 得到结果RSA python代码 import base64 import jsonimport requests f…...
 
Chrome 插件调试
http://blog.haoji.me/chrome-plugin-develop.html#te-bie-zhu-yi-background-de-bao-cuo 手把手:Chrome浏览器开发系列(四):调试我们开发的插件 - 掘金...
 
云轴科技ZStack成为交通运输业上云用云推进中心首批成员单位
近日,中国信息通信研究院、中国交通运输协会信息专业委员会联合发起成立“交通运输业上云用云推进中心”,上海云轴信息科技有限公司(简称云轴科技ZStack)凭借优秀的产品技术创新能力和在交通运输领域的实践经验成为首批成员单位并…...
 
代码随想录算法训练营31期day4,力扣24+19+02.07+142
24,动指针 class Solution { public:ListNode* swapPairs(ListNode* head) {//建立虚拟头结点auto dummynew ListNode(-1);dummy->nexthead;for(auto pdummy;p->next&&p->next->next;){auto ap->next;auto ba->next;p->nextb;a->n…...
 
eNSP学习——利用单臂路由实现VLAN间路由
目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验编址 配置步骤 创建VLAN并配置Access、Trunk接口 配置路由器子接口和IP地址 配置路由器子接口封装VLAN 测试结果 原理概述 在以太网中,通常会使用VLAN技术隔离二层广播域来减少广播的影响&#…...
 
ISO27001认证:企业与个人发展的必备之选
ISO27001认证,对于企业和个人来说,都具有极高的价值和重要性。作为国际权威的信息安全管理体系标准,它为企业提供了保障信息安全、防范风险和提升竞争力的有力工具。 💼对企业的价值: ISO27001认证可以帮助企业满足国家…...
 
SpringBoot使用druid
SpringBoot使用druid 一、前言二、配置1、pom依赖2、配置文件yml3、配置类 一、前言 Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C…...
 
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
 
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
 
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
 
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
 
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
 
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
 
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
