汽車從起點出發駛向目的地,該目的地位於出發位置東面target
英里處。
沿途有加油站,每個station[i]
代表乙個加油站,它位於出發位置東面station[i][0]
英里處,並且有station[i][1]
公升汽油。
假設汽車油箱的容量是無限的,其中最初有startfuel
公升燃料。它每行駛 1 英里就會用掉 1 公升汽油。
當汽車到達加油站時,它可能停下來加油,將所有汽油從加油站轉移到汽車中。
為了到達目的地,汽車所必要的最低加油次數是多少?如果無法到達目的地,則返回-1
。
注意:如果汽車到達加油站時剩餘燃料為 0,它仍然可以在那裡加油。如果汽車到達目的地時剩餘燃料為 0,仍然認為它已經到達目的地。
示例 1:
輸入:target = 1, startfuel = 1, stations =
輸出:0
解釋:我們可以在不加油的情況下到達目的地。
示例 2:
輸入:target = 100, startfuel = 1, stations = [[10,100]]
輸出:-1
解釋:我們無法抵達目的地,甚至無法到達第乙個加油站。
示例 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
思路:首先我們需要明白,乙個車最終能走多遠取決於他在中途加過多少油(可以自己手算驗證一下)。
我們維護乙個車當前能夠到達的最遠距離,在這個距離內,每經過乙個加油站,如果不加油,那麼最遠距離不變,如果加油,最遠距離加上該加油站的油量。
我們總是希望加更多的油,停留更少的加油站,這決定了我們要在所能到達的加油站中,加最多的油那一站停。這就需要排序目前能夠到達的最遠距離的各個加油站的油量,每次走不動的時候我們就選最大油量去加。於是考慮用優先佇列去儲存。直到最後佇列是否為空,如果為空還沒到達target,那麼就返回-1。其實一般情況下在隊列為空之前,就會到達target.
code:
class solution
return -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 公升燃料。它每行...
871 最低加油次數
汽車從起點出發駛向目的地,該目的地位於出發位置東面target英里處。沿途有加油站,每個station i 代表乙個加油站,它位於出發位置東面station i 0 英里處,並且有station i 1 公升汽油。假設汽車油箱的容量是無限的,其中最初有startfuel公升燃料。它每行駛 1 英里就...