優先佇列的使用 Expedition

2022-05-02 11:42:07 字數 1157 閱讀 6006

一、題目描述

你需要駕駛一輛卡車行駛l單位距離。最開始時,卡車上有p單位的汽油。卡車每開1單位距離需要消耗1單位的汽油。如果在途中車上的汽油耗盡,卡車就無法繼續前行,因而無法到達終點。中途共有n個加油站,第i個加油站距離終點ai單位距離,最多可以給卡車加bi單位汽油。假設卡車的燃料箱的容量是無限大的,無論加多少油都沒有問題。那麼請問卡車是否能到達終點?如果可以,最少需要加多少次油?如果不可以輸出-1。(1 ≤ n ≤ 10000,1 ≤ l ≤ 1000000,1 ≤ p ≤ 1000000,1 ≤ ai ≤ l,1 ≤ bi ≤ 100)

二、問題分析

由於加油站的數量非常大,必須像乙個高效的解法。

在卡車開往終點的途中,只有在加油站才可以加油。我們換一種思考方式,如果認為「在到達加油站時i時,再次之後的任何時候都獲得了加bi油的權利」。因為希望到達終點的加油次數盡可能地少,我們可以加經過地加油站的加油量放入優先佇列,當油量不足以到達下一站,則取出優先佇列中的最大值,其實就是貪心演算法,取所有權力中的最大值,最壞的情況時,每次油量都不夠,需要從佇列中取,此時時間複雜度o(nlogn).

三、**實現

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

const

int maxn = 10000 + 10;9

struct

station

1016

}sta[maxn];

17int

n, l, p;

1819

void

slove()

2043 tank +=que.top();

44que.pop();

45 ans++;46}

47 tank -=d;

48 pos =sta[i].pos;

49que.push(sta[i].fuel);50}

51 printf("

%d\n

", ans);52}

53int

main()

54

四、總結

熟練應用優先佇列能很好的解決許多問題。

優先佇列的使用

佇列的特點是先進先出。通常都把佇列比喻成排隊買東西,大家都很守秩序,先排隊的人就先買東西。但是優先佇列有所不同,它不遵循先進先出的規則,而是根據佇列中元素的優先權,優先權最大的先被取出。通常把優先佇列比喻成現實生活中的列印。乙個列印店裡有很多印表機,每台機器的效能不一樣,有的印表機列印很快,有的印表...

優先佇列的使用

堆,一種非常重要的資料結構。能實現資料的自動排序,而且排序時間複雜度為o nlogn 在n達到10 4時,o n2 級演算法就容易超時,但堆排序不會。堆可呼叫stl系統函式,簡化 容易書寫。一般情況,如果堆元素為數 字元 字串都可有用預設的排序規則。如果元素是pair型別,其比較大小的方式為先比較第...

優先佇列的使用(模板)

這個是轉得網上的,由於不經常使用,偶爾用的時候還經常出錯,所以記下來了,經常使用的已經用紅色顏色標出來了 在優先佇列中,優先順序高的元素先出佇列。標準庫預設使用元素型別的 操作符來確定它們之間的優先順序關係。優先佇列的第一種用法,也是最常用的用法 priority queueqi 通過 操作符可知在...