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

      

  • 相关阅读:
    Servlet3.0-使用注解定义Servlet
    poj 1256 Anagram—next_permutation的神奇应用
    poj 1664 放苹果 (划分数)
    poj 1011 Sticks
    poj和hdu部分基础算法分类及难度排序
    Notepad++支持jQuery、html5、css3
    Codeforces Round #395 (Div. 2) C. Timofey and a tree
    Codeforces Round #390 (Div. 2) D. Fedor and coupons
    bazel-编译动态库
    bazel-编译多目标
  • 原文地址:https://www.cnblogs.com/cutemush/p/13781630.html
Copyright © 2020-2023  润新知