1. 程式人生 > >poj 2431加油站問題

poj 2431加油站問題

題目描述大概是這樣的:

你開一輛汽車,已知車內的油箱是無限大的,初始有一定油量P,也已知你要走距離為L,而路上有N個加油站,每個加油站距離你初始位置的距離已知為 A[i],其中含有油量為 B[i], 那麼你的問題就是如何在加油儘可能少的情況下走完全程,如果走不完輸出  -1  ,反之輸出你加油的次數。


關鍵字: 貪心,優先佇列;

由於這是第一篇文章,所以大概敘述下這個部落格的創作思路:

                為了防止思維江化(-1s),所有的題解 ,並不會直接寫出程式碼,只會提供思路 以及儘可能多的測試資料,避免太過依賴以前的思路。


中心思想:

            這題我們目的是想盡可能少的加油,那麼,比較喜歡出現的狀況就是 ,加油站油多,而且我們能在油箱快沒的時候加上,但是很明顯,加油站是固定的,如果我們不在那裡加油,那麼就錯過去了。

            可是,不妨想一下:如果我剛路過加油站就把這些油加上,和我油箱已經沒了再把油加上,走的距離是不是相等?

 有了猜想我們來實踐:

           目前有油 10L 走10km 然後假設突然見到加油站,補充油5L 又走了5km 合計 15km(當然現實裡這顯然不可能)

           假若我目前10L油,我足夠深謀遠慮,提前先加5L油 結果仍然是走了 15km。

假設是成立的,所以,這題的關鍵,在於把每個加油站看做我們可以攜帶的   “油桶”    ,只要需要,我們隨時去補一下,而且我們只去補最大的那桶,但原題測試資料太過龐大,所以    優先佇列  是解決問題的一個關鍵,根據這個特性,我們不斷將  “  油桶  ”  放入佇列,需要時再取出,便可做到加油次數最少。

以下提供一些 AC程式碼的測試資料 ,僅供參考:

10
15 20
14 22
10 21
1 5
6 13
25 41
26 33
9 9
7 7
6 4
35 25
1
2
1 10
15 1
17 5
-1
3
1 1
2 2
3 3
4 1
1
3
1 2
2 0
3 0
4 1
-1
4
1 3
2 6
3 0
5 8
10 1
-1