1. 程式人生 > >POJ2413(expedition) 改編,STL優先佇列的使用

POJ2413(expedition) 改編,STL優先佇列的使用

優先隊列出的順序是按照自己設 置的優先等級來出佇列的,如果自己不設定優先順序的話,預設優先順序為越大優先順序越高。
定義方法: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;
}