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; }