7-3加油站之最少加油次数

67 篇文章 0 订阅
15 篇文章 0 订阅

题目:

一辆汽车要行驶L单位距离。最开始时,汽车上有P单位汽油,每向前行驶1单位距离消耗1单位汽油。如果在途中车上的汽油耗尽,汽车就无法继续前行,即无法到达终点。途中共有N个加油站,加油站提供的油量有限,汽车的油箱无限大,无论加多少油都没问题。给出每个加油站距离终点的距离L和能够提供的油量P,问卡车从起点到终点至少要加几次油?如果不能到达终点,输出-1。

思路

一开始给我们一定的燃料,给定了我们一开始最远可以跑多远,我们这道题要求的是最少加几次油才能到达终点,我们采取的贪心政策是,我们先将每一个地点排序,排序规律是该从起点到该地点的距离大小我们从小开始排。这样就可以保证我们可以将其加油量尽可能最大化。我们从起点开始如果我们的当前油量可以到达当前加油站我们就将其加油站的油量放到最大堆中,一直往后遍历如果我们发现当前油量不足于到达当前加油站时我们就要将最大堆中的最大加油量取出加到我们的当前燃料中,说明我们加了一次油,经过的站点数就得加一。直到当前油量可以到达终点结束循环。

(这道题给出的距离是站点到终点的距离大家做题的时候要当心)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct you
{
    ll a;
    ll b;
}num2[1000000];
bool cmp(you p1,you p2)
{
    return p1.a<p2.a;
}
int main()
{
    int num1;cin>>num1;
    int sum=0,ii=0;
    for(int i=0;i<num1;i++)
    {
        cin>>num2[i].a>>num2[i].b;
    }
    int end,ful;cin>>end>>ful;
    for(int i=0;i<num1;i++)
    {
        num2[i].a=end-num2[i].a;
    }
    sort(num2,num2+num1,cmp);
    priority_queue<int>que;
    while(ful<end)
    {
        if(ii<num1&&ful>=num2[ii].a)
        {
            que.push(num2[ii].b);
            ii++;
        }
        else
        {
            if(!que.empty())
            {
                ful+=que.top();
                que.pop();
                sum++;
            }
            else
            {
                cout<<-1;
                return 0;
            }
        }
    }
    cout<<sum;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

B程洪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值