POJ2413(expedition) 改編,STL優先佇列的使用
阿新 • • 發佈:2018-12-05
優先隊列出的順序是按照自己設 置的優先等級來出佇列的,如果自己不設定優先順序的話,預設優先順序為越大優先順序越高。 定義方法:priority_queue <int> que; 如果想自己決定優先順序 可以這樣寫: priority_queue <int, vector <int>, greater <int> > que; 這樣寫是升序,即值越小優先順序越高 priority_queue <int, vector <int>, less <int> > que; 這樣寫是降序,即值越大優先順序越高 對於結構體型別的佇列定義,以及設定優先順序模板參考如下程式碼: struct node{ int pri; int id; }; // 排序依據是pri的值越小優先順序越高,pri相同則id越小越在前。 bool operator < ( const node &a, const node &b ) // c++ 過載 < { if( a.pri == b.pri ) return a.id > b.id; return a.pri > b.pri; } priority_queue<node> que; // 注意:這裡是從大到小排列的,但是輸出的時候是從小到大排列的。
題目描述:
駕駛一輛卡車行駛 L 單位的距離, 最開始卡車上有 P 單位的汽油。卡車每開一單位的距離就消耗一單位的汽油。如果在途中車上的汽油耗盡,卡車就無法前行,因而無法到達終點。在途中一共有 n 個加油站。 第 i 個加油站距離起點 ai 單位距離,可以最多給卡車加 bi 單位的汽油。假設卡車的燃料箱無限大,如果可地到達終點輸出最少的加油次數,否則輸出 -1。
限制條件:
1 <= n <= 10000
1 <= L <= 1000000, 1 <= p <= 1000000
1 <= ai < L,1 <= bi <= 100
輸入:
4 25 10
10 14 20 21
10 5 2 4
輸出:
2
推薦思路:理解為在到達加油站 i 時, 就獲得了一次在之後任何時候都可以加 bi 單位的汽油的權利。
#include <cstdio> #include <queue> using namespace std; const int MAXN = (int) 1e6 + 7; int n, L, P; int a[MAXN], b[MAXN]; priority_queue<int> que; int main() { while(scanf("%d%d%d", &n, &L, &P) != EOF) { for(int i=0; i<n; i++) scanf("%d", &a[i]); for(int i=0; i<n; i++) scanf("%d", &b[i]); a[n] = L; // 把終點也假設為加油站, 可去掉 b[n] = 0; ++n; while( !que.empty()) que.pop(); int ans = 0, pos = 0, tank = P; // 加油次數 現在的位置 油箱中汽油的量 bool flag = false; for(int i=0; i<n; i++) // 可以遍歷全部的加油站 { int d = a[i] - pos; // 接下來前進的距離 while(tank - d < 0) // 如果油箱中的油不夠走到下一站 { if(que.empty()) // 如果沒油可加,則退出 { flag = true; break; } tank += que.top(); // 有油可加 que.pop(); // 用過的加油站出棧 ans ++; // 加一次油 } if(flag) break; tank = tank - d; // 油箱油減去 pos = a[i]; // 到一個新的加油站 que.push(b[i]); } if(flag) puts("-1"); else printf("%d\n", ans); } return 0; }