贪心算法-最优加油方法

2018-05-21  本文已影响0人  _Monk

题目

图1. 题目要求

思路

  1. 题目要求最少加油次数,为了加油次数最少,我们需要考虑下面的问题
  1. 怎么解决上面的两个问题

代码实现

bool cmp(const std::pair<int, int> &a, const std::pair<int, int> &b)
{
    return a.first > b.first;
}
int getMinimumStop(std::vector<std::pair<int, int>> &stop, int P, int L)
    {
        int minimumStop = 0;
        std::priority_queue<int> 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;
    }
上一篇 下一篇

猜你喜欢

热点阅读