贪心算法-最优加油方法
题目
文章图片
图1. 题目要求 思路
- 题目要求最少加油次数,为了加油次数最少,我们需要考虑下面的问题
- 什么时候加油能使得加油次数最少?
当油用完的时候加油。
具体实现:判断到下一个加油站的距离和此时油量的大小,如果油量大于距离则还不用加油,如果油量小于距离则需要加油。 - 在哪个加油站加油可以使得加油的次数最少?
在油量最大的加油站加油。
具体实现:可以使用一个数据结构保存经过的加油站的油量,当油量不够到下一站的时候从其中取出油量最大的值。
- 怎么解决上面的两个问题
-
对问题进行建模:
文章图片
图1. 问题建模
【贪心算法-最优加油方法】在数轴上的点表示加油站。
文章图片
图2. 思路分析
文章图片
图3. 流程分析
bool cmp(const std::pair &a, const std::pair &b)
{
return a.first > b.first;
}
int getMinimumStop(std::vector> &stop, int P, int L)
{
int minimumStop = 0;
std::priority_queue Q;
// 用来存放油量的最大堆
stop.push_back(std::make_pair(0, 0));
// 将终点作为一个停靠点添加到stop中std::sort(stop.begin(), stop.end(), cmp);
// 将停靠点到终点的距离大小排序for (int i = 0;
i < stop.size();
i++) {// 遍历各个停靠点
int distance = L - stop[i].first;
while (!Q.empty() && P < distance) {// 如果剩余油量不够到下一个加油站则要加油
P += Q.top();
Q.pop();
minimumStop++;
}
if (Q.empty() && P < distance) {
return -1;
}
P = P - distance;
L = stop[i].first;
Q.push(stop[i].second);
}return minimumStop;
}
推荐阅读
- 画解算法(1.|画解算法:1. 两数之和)
- Guava|Guava RateLimiter与限流算法
- 一个选择排序算法
- SG平滑轨迹算法的原理和实现
- 《算法》-图[有向图]
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- 虚拟DOM-Diff算法详解
- 《数据结构与算法之美》——队列
- 算法回顾(SVD在协同过滤推荐系统中的应用)
- 简谈迪克斯特拉算法