汽車從起點出發駛向目的地,該目的地位於出發位置東面 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 英里就...