题目:
一辆汽车要行驶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;
}