871 最低加油次數

2021-10-25 11:11:51 字數 1445 閱讀 6712

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

沿途有加油站,每個 station[i] 代表乙個加油站,它位於出發位置東面 station[i][0] 英里處,並且有 station[i][1] 公升汽油。

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

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

為了到達目的地,汽車所必要的最低加油次數是多少?如果無法到達目的地,則返回 -1 。

注意:如果汽車到達加油站時剩餘燃料為 0,它仍然可以在那裡加油。如果汽車到達目的地時剩餘燃料為 0,仍然認為它已經到達目的地。

由於加油站都在路途上,可以考慮每到達乙個加油站時,先把油儲存起來,當油量無法支援時,就從儲存的油量中選擇乙個油最多的來加,直到能到達終點。顯然,每次都取最大的,很容易想到優先佇列,用優先佇列來優化時間複雜度可以達到o(nlongn)

class

solution};

intminrefuelstops

(int target,

int startfuel, vectorint>>

& stations)

priority_queue<

int, vector<

int>

, cmp> pq;

int start = startfuel;

int ans =0;

for(

int i =

0; i < n; i++

)//取油最多的來加

int tmp = pq.

top();

pq.pop();

ans++

; start +

= tmp;

}//到達該加油站了,可以把該加油站的油量放進佇列了

pq.push

(stations[i][1

]);}

//開始開往終點了

while

(start < target)

//同理取油

int tmp = pq.

top();

pq.pop();

ans++

; start +

= tmp;

}return ans;}}

;

定義dp[i]表示加油i次時能達到的最大距離,dp[0]就是初始油量,對於每個加油站,可以遍歷每個加油次數的最大距離,如果可以達到該加油站,就可以通過多加一次油來達到更遠的距離。

class

solution}}

for(

int i =

0; i <= n; i++)}

return-1

;}};

871 最低加油次數

汽車從起點出發駛向目的地,該目的地位於出發位置東面target英里處。沿途有加油站,每個station i 代表乙個加油站,它位於出發位置東面station i 0 英里處,並且有station i 1 公升汽油。假設汽車油箱的容量是無限的,其中最初有startfuel公升燃料。它每行駛 1 英里就...

871 最低加油次數

class solution 如果當前餘下的汽油不足以跑到這個加油站 while curpos gasleft curstationpos 那麼著找出之前加油最多的油來加 把最多的油加上去 gasleft q.top q.pop addgastimes 向前開的過程中肯定存在油量的消耗 const ...

871 最低加油次數

汽車從起點出發駛向目的地,該目的地位於出發位置東面target英里處。沿途有加油站,每個station i 代表乙個加油站,它位於出發位置東面station i 0 英里處,並且有station i 1 公升汽油。假設汽車油箱的容量是無限的,其中最初有startfuel公升燃料。它每行駛 1 英里就...