【贪心】POJ 2431:Expedition

一、题目内容

POJ 2431 原题地址

二、题意解释

一辆卡车,初始时,距离终点L,油量为P,在起点到终点途中有n个加油站,每个加油站油量有限,而卡车的油箱容量无限.
卡车在行车途中,每走一个单位的距离消耗一个单位的油量,给定n个加油站距离终点的距离以及油存储量。
问卡车是否能到达终点,如果可达,最少需要加多少次油,否则输出-1.

三、代码及注释

#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
int N,L,P;
struct station{
    int a,b;//a为与起始位置的距离,b为油量
    bool operator < (const station& A) const{
        return a<A.a;
    }
}st[10005];
priority_queue<int> Q;
void solve()
{
    scanf("%d",&N);
    for(int i=0; i<N; i++)
    {
        scanf("%d%d",&st[i].a,&st[i].b);
    }
    scanf("%d%d",&L,&P);
    //这里注意,输入的a起初是距离town的距离,需要通过L-a变成距离现在位置的距离
    for(int i=0; i<N; i++)
    {
        st[i].a=L-st[i].a;
    }
    int ans=0,pos=0,tank=P;
    st[N].a=L;
    st[N].b=0;
    N++;
    sort(st,st+N);
    for(int i=0; i<N; i++)
    {
        int t=st[i].a-pos;
        //贪心,只有在油不足时才加油,且加最大的油
        while(tank<t)
        {
            if(Q.empty())//如果为空,说明没油可加,输出-1
            {
                printf("%d",-1);
                return;
            }
            tank+=Q.top();
            Q.pop();
            ans++;
        }
        tank-=t;
        Q.push(st[i].b);
        pos=st[i].a;
    }
    printf("%d\n",ans);
}
int main()
{
    solve();
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mad Idea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值