Xavier养的一群奶牛劫持了一个卡车,并向丛林中逃亡。由于奶牛们不会开车,卡车不幸地撞上了丛林中的一块岩石,并撞破了油箱。于是他们每行驶一个单位距离,油箱就漏一单位油。
为了修理这个卡车,奶牛们需要沿着一条长长的公路行驶到最近的一个城镇。在这条路上,在卡车当前位置和城镇之间,有N个加油站,每个加油站有不多于100单位的汽油。
丛林对于人类来说是个危险的地方,更不用说奶牛了。因此,奶牛们想要他们停下加油的次数尽量少。幸运的是,卡车的油箱是如此的大,可以容纳任意多的汽油。卡车现在距离城镇L单位长度,油箱里有P单位的油。
请求出奶牛们最少的加油次数,或者他们根本无法到达城镇,无解请输出-1
输入
第一行有一个整数N(N <= 10 , 000)。
下面N行,每行两个整数,分别代表每个加油站与城镇的距离和本加油站拥有的汽油量。
最后一行有两个整数,L和P。(1 <= P <= 1 , 000 , 000)
输出
如果奶牛们能到达城镇,输出一个整数,代表最少加油的次数。否则输出-1。
样例输入
4
4 4
5 2
11 5
15 10
25 10
样例输出
2
先行驶10单位距离,加10单位油,再行驶4单位距离,加5单位油,行驶到城镇。
#include<bits/stdc++.h>
using namespace std;
int n,l,p,ans=0,num,t,w=0;
priority_queue<int>q;
struct node
{
int a,b;
} s[10100];
bool cmp(node sss,node ssss)
{
return sss.a<ssss.a;
}
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d%d",&s[i].a,&s[i].b);
//每个加油站与城镇的距离和本加油站拥有的汽油量
scanf("%d%d",&l,&p);
//距离城镇L单位长度,油箱里有P单位的油
n++;
for(int i=1; i<=n; i++)
s[i].a=l-s[i].a;
sort(s+1,s+1+n,cmp);
num=p;
for(int i=1; i<=n; i++)
{
t=s[i].a-w; //距离下一个油站的距离
while(num<t) //如果现有的油不能走到那个油站,则要加油了
{
if(q.empty())
{
cout<<-1<<endl;
return 0;
}
ans++;
num+=q.top();
q.pop();
}
num-=t; //油量减少
q.push(s[i].b); //将第i个油站的油量加入堆中
w=s[i].a; //走到第i个油站
}
cout<<ans<<endl;
return 0;
}