探险

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值