题目链接:https://cn.vjudge.net/problem/POJ-2431
题意:
一辆卡车在长为 L 的一条路上行驶,,每走 1 步耗费 1 单位油,,初始油量为 P ,路上共 N 个加油站,给出每座加油站的油量和距离终点的距离,假设油箱无限大,,求得到达终点时的最少加油次数,,无法到达则输出 -1。
分析:
我们可以想象成,在到达加油站 i 时,就获得了一次在之后的任何时候都可以给车加油的机会。接下来再运用一下贪心的思想, 我们只在没油的时候加油,,而且一旦加油就加之前路过的加油站储油最大的即可。如果没油了而且又无法加油,则无法到达。这样可以用优先队列来解决,每次优先队列的 top 都是队列中所有元素的最大值。注意:这道题中输入的加油站到终点的距离不一定是按顺序的,可能先输入距离远的再输入近的,需要从大到小 sort 一下。
代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
pair<int, int> a[10005];
int main(){
int n, l, p;
scanf("%d", &n);
for(int i = n-1; i >= 0; i--)
scanf("%d %d", &a[i].first, &a[i].second);
scanf("%d %d", &l, &p);
for(int i = 0; i < n; i++)
a[i].first = l - a[i].first;
sort(a, a + n);
a[n].first = l; //假设终点是一个储油量为 0 的加油站
a[n].second = 0;
priority_queue<int> que;
int ans = 0, pos = 0, tank = p, d;
for(int i = 0; i <= n; i++){
d = a[i].first - pos;
while(tank - d < 0){
if(que.empty()){
printf("-1\n");
return 0;
}
tank += que.top();
que.pop();
ans++;
}
tank -= d;
pos = a[i].first;
que.push(a[i].second);
}
printf("%d\n", ans);
return 0;
}