POJ 2431 Expedition

原题链接

思路:在剩余油量所能到达的距离内且为使用过的加油站中选择加油最多的一个。用到优先队列。

AC代码:

#include <iostream>
#include <stdio.h> 
#include <algorithm>
#include <cstdlib>
#include <queue> 
#include <vector>
#include <functional>  //greater<int>
using namespace std;

priority_queue<int> que;
//各个加油站的加油量的优先队列 
int n,l,p,pos,tank;
//n是加油站个数 
//pos是当前位置,tank是当前油量
struct ab{
    int a,b;
}m[10003];

bool cmp(ab p,ab q)
{
    return p.a<q.a;
}
int main()
{
    int i;
    cin>>n;
    getchar();
    for(i=0;i<n;i++)
    {
        cin>>m[i].a>>m[i].b;
        getchar();
    }
    cin>>l>>p;
    getchar();
    for(i=0;i<n;i++)  m[i].a=l-m[i].a;
    m[n].a=l;
    m[n].b=0;  //将终点当作油量为0的加油站
    n++;
    sort(m,m+n,cmp);
    tank=p;
    pos=0;
    int ans=0;
    for(i=0;i<n;i++)
    {
        int d=m[i].a-pos;  //d为到下一个加油站的距离 
        while(tank-d<0)  //如果油不够支撑到下一个加油站 
        {
            if(que.empty())
            {
                cout<<-1<<endl;
                return 0;
            }
                tank+=que.top();  //选择队列中油量最多的加油站 
                que.pop();
                ans++;
        }
        pos=m[i].a;  //移动到这个加油站位置 
        tank-=d;  //有量减少
        que.push(m[i].b);  //将这个加油站油量加入队列 
    }
    cout<<ans<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值