LeetCode 871 - 最低加油次數 - [貪心+優先隊列]

汽車從起點出發駛向目的地,該目的地位於出發位置東面 target 英里處。spa

沿途有加油站,每一個 station[i] 表明一個加油站,它位於出發位置東面 station[i][0] 英里處,而且有 station[i][1] 升汽油。rest

假設汽車油箱的容量是無限的,其中最初有 startFuel 升燃料。它每行駛 1 英里就會用掉 1 升汽油。code

當汽車到達加油站時,它可能停下來加油,將全部汽油從加油站轉移到汽車中。blog

爲了到達目的地,汽車所必要的最低加油次數是多少?若是沒法到達目的地,則返回 -1 。get

注意:若是汽車到達加油站時剩餘燃料爲 0,它仍然能夠在那裏加油。若是汽車到達目的地時剩餘燃料爲 0,仍然認爲它已經到達目的地。it

 

示例 1:io

輸入:target = 1, startFuel = 1, stations = []
輸出:0
解釋:咱們能夠在不加油的狀況下到達目的地。class

示例 2:queue

輸入:target = 100, startFuel = 1, stations = [[10,100]]
輸出:-1
解釋:咱們沒法抵達目的地,甚至沒法到達第一個加油站。top

示例 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 升。而後咱們開車抵達目的地。
咱們沿途在1兩個加油站停靠,因此返回 2 。

提示:

1 <= target, startFuel, stations[i][1] <= 10^9
0 <= stations.length <= 500
0 < stations[0][0] < stations[1][0] < ... < stations[stations.length-1][0] < target

 

AC代碼:

struct Solution
{
    priority_queue<int> Q;
    int minRefuelStops(int target,int startFuel,vector<vector<int>>& sta)
    {
        vector<int> v={target,0};
        sta.push_back(v);
        int cnt=0, pos=0, rest=startFuel;
        for(int i=0;i<sta.size();i++)
        {
            int dist=sta[i][0]-pos;
            while(rest<dist)
            {
                if(Q.empty()) return -1;
                rest+=Q.top(); Q.pop(); cnt++;
            }
            rest-=dist; pos=sta[i][0];
            Q.push(sta[i][1]);
        }
        return cnt;
    }
};
相關文章
相關標籤/搜索