Description
一群驴友驾驶一辆卡车前往树林里探险。但是由于他们的驾驶技术太糟,油箱在路上给弄破了,所以他们每前进一个单位的路程就会消耗掉一个单位的油(包括漏掉的汽油),为了修好油箱,驴友们必须前往最近的城市。在当前位置和城市之间有N个加油站,驴友们可以在加油站加1到100单位的油(每个加油站存油量不等)。对于人来说,树林是个危险的地方。所以,驴友们要尽可能的少停站加油。幸运的是,这辆卡车的油箱非常大,你可以认为它的容量是无穷大的。卡车在离城P个单位时还有L个单位的油。 你要算出驴友们至少要停几站才能到城市,或者驴友们根本到不了城市。
Input
第1行:一个整数N;
第2到N+1行:每行有两个用空格隔开的整数,描述一个加油站。第一个数表示这个加油站离城市的距离,第二个数表示在这个加油站最多可以加多少油。
第N+1行:两个用空格分开的整数P和L。
Output
一个整数,表示卡车到城市最少要停站加油的次数,如果无法到达输出-1。
Sample Input
4
4 4
5 2
11 5
15 10
25 10
Sample Output
2
Sample Explanation
现在卡车离城市25个单位,卡车里有10个单位的油。在路上,有4个加油站,分别距离城市4,5,11,15,分别距离卡车则为21,20,14,10,这些加油站分别最多可加油4,2,5,10个单位.开10个单位,加满油10单位油,在开4个单位,加满5单位的油,接着直接开到城市。
Hint
100%的数据:1≤N≤104,1≤P≤106。
Source
思路
对于每一个节点i如果i能到,将a[i]入队
如果i不能到,从队中找到存油量最多的加油点加油
code
#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int dis;
int num;
}a[10010];
bool cmp(node p,node q)
{
return p.dis>q.dis;
}
int main()
{
freopen("2465.in","r",stdin);
freopen("2465.out","w",stdout);
int n,l,p,ans=0,i;
scanf("%d",&n);
priority_queue<int >q;
for(i=1;i<=n;i++)
scanf("%d%d",&a[i].dis,&a[i].num);
scanf("%d%d",&p,&l);
q.push(l);
i=1;
sort(a+1,a+n+1,cmp);
while(p>0&&!q.empty())
{
int t=q.top();
q.pop();
p-=t;
if(p<=0)break;
ans++;
while(i<=n&&p<=a[i].dis)
{
q.push(a[i].num);
i++;
}
}
if(p<=0)
printf("%d\n",ans);
else
printf("-1\n");
return 0;
}