题目大意,在一条路上有n个加油站,每个加油站有两个整数表示a(到终点的距离),b(这个加油站可以加的油量),最后一行,l(车一开距离终点的距离),p(车一开始油箱的油量)。让你求解到达终点加油次数最少为多少,不能到达输出-1
本题才有优先队列的来解决。
车的油箱是无穷大的,所以碰到加油站就可加油,所以当车没油的时候可以认为在该点之前所有的加油站都是可以加油的,既然要求次数最少,那就要先加油量最大的加油站,当然,经过一个加油站就要把它放进队列。
#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;
struct fuel
{
int dis,oil;
}data[10010];
bool cmp(const fuel &sa,const fuel &sb)
{
return sa.dis>sb.dis;
}
int main()
{
int n,l,p,ans;
while(scanf("%d",&n)!=EOF)
{
priority_queue<int>pq;
ans=0;
for(int i=0;i<n;i++)
scanf("%d%d",&data[i].dis,&data[i].oil);
scanf("%d%d",&l,&p);
pq.push(p);
int i=0;
sort(data,data+n,cmp);
while(l>0&&!pq.empty())
{
int tank=pq.top();
pq.pop();
l-=tank;
ans++;
while(i<n&&l<=data[i].dis)
{
pq.push(data[i++].oil);
}
}
printf("%d\n",l<=0?ans-1:-1);
}
return 0;
}