一群牛抓了一辆卡车,冒险深入丛林探险。奶牛开车技术很差,不幸地撞到了一块岩石,把卡车的油箱撞破了。卡车现在每行驶一单位距离就会泄漏一单位燃料。
为了修理卡车,奶牛们需要沿着一条长长的蜿蜒的道路开到最近的城镇(距离不超过1,000,000个单位)。在这条道路上,在城镇和当前的卡车位置之间,有N (1 <= N <= 10,000)个燃料站,奶牛可以停下来获取额外的燃料(1…每站100套)。
丛林对人类来说是一个危险的地方,对牛来说尤其危险。因此,奶牛想要在去城镇的路上尽可能少地停下来加油。幸运的是,他们卡车油箱的容量非常大,实际上它可以容纳的燃料量没有限制。卡车目前距离城镇L单位,有P单位燃料(1 <= P <= 1,000,000)。
确定到达城镇所需的最少站数,或者确定奶牛根本无法到达城镇。
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
#define N 10005
int n,L,P;
struct node{
int dis,add;//距离,可加油量
}port[N];
bool cmp(node a,node b){
return a.dis>b.dis;//按距离降序
}
void solve(){
priority_queue<int>que;
//ans:加油次数 pos:当前可到达的位置 k:第k个加油站
int ans=0,pos=P,k=0;
while(pos<L){
while(pos>=L-port[k].dis&&k<n){
que.push(port[k].add);
k++;
}
if(que.empty()){
printf("-1\n");
return ;
}
else{
pos+=que.top();
que.pop();
ans++;
}
}
printf("%d\n",ans);
}
int main(){
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
scanf("%d %d",&port[i].dis,&port[i].add);
scanf("%d%d",&L,&P);
sort(port,port+n,cmp);
solve();
}
return 0;
}