优先队列出的顺序是按照自己设 置的优先等级来出队列的,如果自己不设置优先级的话,默认优先级为越大优先级越高。
定义方法: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;
}