[Usaco2005 open]Expedition

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

  

原文地址:https://www.cnblogs.com/cutemush/p/13781630.html