题目描述:
驾驶一辆卡车行驶L距离。最开始时候卡车上有P单位汽油,一个单位汽油可以行驶一个单位距离。如果途中汽油耗尽就无法继续前进,从而无法到达终点。在途中有N个加油站,第i个加油站距离终点距离为Ai,可以给卡车加Bi单位汽油。假设卡车油箱无限大,问最少需要加多少次油才能到达终点?不能到达终点输出-1.
解题思路:
一个朴素的想法就是对于能到的每个加油站分情况计算,加油还是不加,但是数据量巨大,方法显然不可行。那么可以换种想法,对于已经经过的加油站,让加油更加高效,也就是在每次油箱耗尽的时候选择加油量最多的加油站加油。如果这个时刻没有加油站可用那么就无法到达。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=10010;
struct node{
intdist, fuel;
}position[maxn];
int n, L, P;
bool cmp(const node &a, const node&b){
returna.dist > b.dist;
}
int main(){
while(scanf("%d",&n)!=EOF){
priority_queue<int>heap;
for(inti=0;i<n;i++)
scanf("%d%d",&position[i].dist,&position[i].fuel);
sort(position,position+n,cmp);
scanf("%d%d",&L,&P);
intt=0;
heap.push(P);
intindex=0;
while(L>0&&!heap.empty()){
t++;
inttmp = heap.top();
heap.pop();
L-=tmp;
while(index<n&&L<=position[index].dist)
heap.push(position[index++].fuel);
}
printf("%d\n",L<= 0?t-1:-1);
}
}