Expedition

题目描述:

         驾驶一辆卡车行驶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);
         }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值