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