已知一条公路上,有一个起点与一个终点,这之间有n个加油站;已知从这n个加 油站到终点的距离d与各个加油站可以加油的量l,起点位置至终点的距离L与起 始时刻油箱中汽油量P;假设使用1个单位的汽油即走1个单位的距离,油箱没有 上限,最少加几次油,可以从起点开至终点?(如果无法到达终点,返回-1)

这个贪心过程和跳越游戏的贪心规律十分类似,跳跃游戏:获取最少跳跃次数,即在无法到达更远的地方时,在这之前应该跳到一个可以到达更 远位置的位置!

这里和跳跃游戏的差异是跳跃游戏中节点之间的距离是恒定的,而本题目中节点之间的距离却是不定得,所以想要在初始油量的支撑下获取可以加油的节点的过程中需要实时维护一个最大值,即节点可以加的油量(这个维护使用最大堆来维护)。

过程如下:
1.设置一个最大堆,用来存储经过的加油站的汽油量。
2.按照从起点至终点的方向,遍历各个加油站之间与加油站到终点距离。
3.每次需要走两个加油站之间的距离d,如果发现汽油不够走距离d时,从最 大堆中取出一个油量添加,直到可以足够走距离d。
4.如果把最大堆的汽油都添加仍然不够行进距离d,则无法达到终点。
5.当前油量P减少d。
6.将当前加油站油量添加至最大堆

实现如下:

int cmp(pair<int,int> a,pair<int,int> b) {return a.first > b.first;
}/*
L为起点到终点的距离
P起点初始的汽油容量
stop:<加油站至终点的距离,加油站汽油量>
*/
int get_least_expedition(int L, int P,vector<pair<int,int>> &stop) {priority_queue<int> Q;//维护的最大堆int result = 0;//记录加油的次数sort(stop.begin(), stop.end(),cmp);//对加油站至终点的距离从大到小进行排序,防止输入无序的情况stop.push_back(make_pair(0,0));//将终点的pair入数组for (int i = 0;i < stop.size(); ++i) {int dis = L - stop[i].first;/*加油的条件是堆中油量不为空且当前油量小于要行驶的距离*/while(!Q.empty() && dis > P){P += Q.top();Q.pop();result ++;}/*无法到达终点的情况是最大堆中无油可加,且当前油量不足以行驶剩余距离*/if (Q.empty() && dis > P) {return -1;}P -= dis;L = stop[i].first;Q.push(stop[i].second);}return result;
}

测试代码如下:

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>using namespace std;int cmp(pair<int,int> a,pair<int,int> b) {return a.first > b.first;
}int get_least_expedition(int L, int P,vector<pair<int,int>> &stop) {priority_queue<int> Q;int result = 0;sort(stop.begin(), stop.end(),cmp);stop.push_back(make_pair(0,0));for (int i = 0;i < stop.size(); ++i) {int dis = L - stop[i].first;while(!Q.empty() && dis > P){P += Q.top();Q.pop();result ++;}if (Q.empty() && dis > P) {return -1;}P -= dis;L = stop[i].first;Q.push(stop[i].second);}return result;
}int main() {vector<pair<int,int>> stop;int P;int L;int distance,fuel;int N;cin >> N;for (int i = 0;i < N; ++i) {cin >> distance;cin >> fuel;stop.push_back(make_pair(distance,fuel));}cin >> L;cin >> P;cout << get_least_expedition(L,P,stop);return 0;
}

输入输出如下

输入:
4
4 4
5 2
11 5
15 10
25 10
输出:
2

贪心:expedition 最优加油方法相关推荐

  1. 【贪心算法】poj 2431: Expedition(最优加油方法)

    题目描述(传送门) Description A group of cows grabbed a truck and ventured on an expedition deep into the ju ...

  2. 装箱问题c语言函数,C语言基于贪心算法解决装箱问题的方法

    本文实例讲述了C语言基于贪心算法解决装箱问题的方法.分享给大家供大家参考,具体如下: 问题描述: 有一些箱子,容量为V,同时有n个物品,每个物品有一个体积(小于等于箱子容量),要求将物品全部装入箱子中 ...

  3. c语言装箱问题思路,C语言基于贪心算法解决装箱问题的方法

    本文实例讲述了C语言基于贪心算法解决装箱问题的方法.分享给大家供大家参考,具体如下: 问题描述: 有一些箱子,容量为V,同时有n个物品,每个物品有一个体积(小于等于箱子容量),要求将物品全部装入箱子中 ...

  4. 机器学习之超参数调优——超参数调优的方法

    超参数调优的方法 概述 网格搜索 随机搜索 贝叶斯优化算法 概述 对于很多算法工程师来说, 超参数调优是件非常头疼的事.除了根据经验设定所谓的"合 理值"之外, 一般很难找到合理的 ...

  5. 贪心法——最优装载问题

    贪心法--最优装载问题 最优装载问题.给出nn个物体,第ii个物体重量为wiw_i.选择尽量多的物体,使得总重量不超过C<script id="MathJax-Element-230& ...

  6. Java 小白 设计加油站类和汽车类,加油站提供一个给车加油的方法,参数为剩余汽油数量。每次执行加油方法,汽车的剩余数量都会加2

    //设计加油站类和汽车类,加油站提供一个给车加油的方法,参数为剩余汽油数量.每次执行加油方法,汽车的剩余数量都会加2 public class fourteen {public static void ...

  7. 《战地3》9800gt 画面设置 ultra跑50帧以上,最优设置方法公开

    <战地3>9800gt 画面设置 ultra跑50帧以上,最优设置方法公开 发布时间:2011-11-08浏览次数:1231 2 field of view 视野范围设成 60 ,这个设低 ...

  8. 如何给台式计算机风扇加油,CPU风扇旋转声音大怎么加油?CPU风扇加油方法详细介绍...

    CPU风扇旋转声音大怎么加油?我们来说说为什么要给CPU风扇加油,CPU风扇在旋转了无数圈之后,出厂时风扇滚轴上的油就会被慢慢消耗掉,这也是CPU风扇发声的主要根源.下面我们来看看CPU风扇加油的方法 ...

  9. 主要内容: 本文提出了一种基于(ppo)的微电网最优调度方法。 该方法采用强化学习(RL)来学习调度策略,并积累相应的调度知识。 同时,引入ppo模型,将微电网调度策略动作从离散动作空间扩展到连续动作

    MATLAB代码:微电网 强化学习 关键词:微电网 强化学习 RL Reinforcement Learning 参考文档:<Optimal Scheduling of Microgrid Ba ...

最新文章

  1. Numerical Geometry of Image
  2. xcode 的一些问题
  3. u-boot移植初步尝试-tiny4412
  4. nodejs后台启动
  5. mysql 数据库事务处理_MySQL数据库事务及其原理
  6. 使用命令对象代替switch语句的写法示例
  7. 运维常用进程查看命令
  8. Javascript IE 内存释放
  9. es6 Null 传导运算符
  10. TensorFlow 2.4 发布
  11. 正则表达式之子表达式 ‘()’ 中表达式 '[]' 大表达式 '{}'
  12. 再读《SAP德国造》
  13. Apache日志配置详解(rotatelogs LogFormat)
  14. chromebook安装devos和chrome os双启动经验分享
  15. html 免备案,免备案香港主机对网站SEO有影响吗?
  16. 利用googlemap查询经纬度
  17. 【渝粤教育】广东开放大学 领导学基础 形成性考核 (38)
  18. 免费的网页截屏API有哪些?
  19. 4K高清屏幕保护工具Aquarium 4K for Mac
  20. java二重积分_对比较简单点的二重积分的做题方法

热门文章

  1. 如何将简单CMS后台管理系统示例转换为Java、Php等不同后台语言的版本
  2. SharePoint 客户端经常弹出Windows验证登录框问题
  3. studio2008 无法显示该网页
  4. 如何修改Sql2005注册服务器名称 {转载}
  5. oracle home 命令,$ORACLE_HOMEbin目录下所有命令的使用方法及命令详解
  6. rpm安装的mysql如何数据迁移_【鲲鹏翱翔】数据库04-MySQL5.7.28移植安装指南-RPM包方式...
  7. stk 坐标系_STK学习-坐标系
  8. oracle十六进制转数字,16进制如何转化为10进制?
  9. 服务器主机防御系统,主机入侵防御系统
  10. java soap协议头_java – 服务器无法识别HTTP标头“SOAPAction”的值