zoukankan      html  css  js  c++  java
  • [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;
    }
    

      

  • 相关阅读:
    因子和阶乘
    周期串
    字符串~键盘错位
    6174问题
    HDU_1015——撬锁,5循环
    HDU_1372——骑士移动,二维空间BFS
    HDU_1372——骑士移动,BFS非模版
    HDU_2001——计算两点之间的距离
    HDU_2212
    HDU_1999——不可摸数
  • 原文地址:https://www.cnblogs.com/cutemush/p/13781630.html
Copyright © 2011-2022 走看看