题目:一辆车要从一个城市到另一个城市,给你距离L和出发时的汽油总量P,路上里终点
Xi
的的地方有加油站可以加
Yi
汽油,问最少加几次油能到达终点,如果不能到达输出-1.
题解:将离终点距离转化为离起点距离,一直走,等汽油消耗完了之后再从前面走过的加油站中选取可加油量最大的一个,重复这样。用优先队列维护。
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const int maxn = 1e4 + 5;
priority_queue<ll> q;
struct bbq
{
ll a,b;
};
bbq x[maxn];
bool cmp(bbq a, bbq b)
{
return a.a < b.a;
}
int main()
{
ll n,L,P;
while (~scanf("%lld",&n))
{
memset(x,0,sizeof x);
while(!q.empty())
{
q.pop();
}
for (int i = 0; i < n; i++)
{
scanf("%lld %lld",&x[i].a,&x[i].b);
}
scanf("%lld %lld",&L,&P);
for (int i = 0; i < n; i++)
{
x[i].a = L - x[i].a;
}
x[n].a = L;
sort(x,x+n,cmp);
ll ans = 0,flag = 0;
for (int i = 0; i <= n; i++)
{
while(P < x[i].a && !q.empty())
{
P += q.top();
q.pop();
if(P < x[i].a && q.empty())
{
flag = 1;
break;
}
ans++;
}
if(P >= x[i].a)
{
q.push(x[i].b);
}
}
if(!flag)
{
printf("%lld\n",ans);
}
else printf("-1\n");
}
}