CNUOJ 0576 加油


40017074加油
难度级别:C;            运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述

你需要驾驶一辆汽车行驶S个单位的距离。最开始汽车上有P个单位的汽油,汽车每开行1个单位的距离需要消耗1个单位的汽油。如果汽车中途汽油耗尽,将无法继续行驶,因此也就无法到达终点。途中一共有N个加油站,第i个加油站距离起点的距离为Ai个单位距离,第i个加油站你最多可以给汽车加Bi个单位的汽油。假设汽车的邮箱无限大,根据所给的数据,请你计算汽车能否达到终点,如果能到达终点,输出最少需要加油的次数,如果不能到达终点,输出-1。


输入

第一行共三个正整数,分别表示N、S和P;第二行有N个正整数分别表示A1,A2,……,An;第三行有N个正整数分别表示B1,B2,……,Bn;每一行的各个数据两两之间用一个空格分隔。

输出

按要求输出结果。

输入示例

4 25 10 10 14 20 21 10 5 2 4

输出示例

2

其他说明

数据范围:0<N<=10000,0<S,P<=1000000,0<Ai<=S,0<Bi<=100.

咋一看这题就知道是小贪心了吧?

在汽车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站时,就获得了一次在之后的任何时候都可以加Bi单位汽油的权利”,在解决问题上应该也是一样的,而在之后需要加油时,就认为是在之前经过的加油站加的油就可以了。

那么,因为希望到达终点的加油次数少,所以我们把汽车剩余燃料耗到0时再加油看起来是不错的方法。在燃料为0时,找汽车从该阶段起点出发时到燃料为0时的位置内能加油最多的加油站,这是显然的。所以我们可以用队列(prioeity_queue)

在经过加油站i时,往优先队列里加入Bi(也就是说油还够,可以继续行驶)

途中燃料耗尽时,

?如果优先队列也是空的,说明途中没有加油站,则无法达到终点,输出-1

?否则取出优先队列最大值,并给汽车加油

注意,prioeity_queue队列中的top()是取目前队列中的最大值。

切莫忘记将输入数据按加油站从起点到终点的位置顺序(a[i])排序,输因为入时加油站不一定是按位置顺序输入的,我当时就在这磕着了......

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int ans,pos,n,s,p,i;//ans加油次数,pos现在位置
struct GasStation
{
    int pos,gas;
    GasStation(){
        pos=0;
        gas=0;
    }
    bool operator < (const GasStation b)const
    {
        return pos<b.pos;
    }
}a[10001];
int main()
{
    priority_queue<int> que;
    scanf("%d%d%d",&n,&s,&p);
    for(i=0;i<n;i++) scanf("%d",&a[i].pos);
    for(i=0;i<n;i++) scanf("%d",&a[i].gas);
    sort(a,a+n);
    a[n].pos=s,a[n].gas=0,n++;
    int tank=p;//油箱中汽油量
    for(i=0;i<n;i++){
	int d=a[i].pos-pos;//下一个加油站距离现在位置的距离
	while(tank-d<0)//不断加油直到油量足够行驶到下一个加油站
	{
	    if(que.empty()){
		putchar(‘-‘),putchar(‘1‘);
		return 0;
	    }
	    tank+=que.top();
	    que.pop();
	    ans++;
	}
	tank-=d;
	pos=a[i].pos;
	que.push(a[i].gas);
    }
    printf("%d",ans);
    return 0;
}

此题解来源于挑战程序设计竞赛(第2版)2.4节Expedition

原题来源于POJ2431

时间: 2024-09-29 09:15:44

CNUOJ 0576 加油的相关文章

汽车加油行驶(cogs 737)

?问题描述:给定一个N*N 的方形网格,设其左上角为起点◎,坐标为(1,1),X 轴向右为正,Y轴向下为正,每个方格边长为1,如图所示.一辆汽车从起点◎出发驶向右下角终点▲,其坐标为(N,N).在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油.汽车在行驶过程中应遵守如下规则:(1)汽车只能沿网格边行驶,装满油后能行驶K 条网格边.出发时汽车已装满油,在起点与终点处不设油库.(2)汽车经过一条网格边时,若其X 坐标或Y 坐标减小,则应付费用B,否则免付费用.(3)汽车在行驶过程中遇油库则应

为自己加油,不为别人喝彩

还是先不写标题,等写完随笔的时候,标题自然就浮现出来了.学习时间的越发紧迫,需要接受的技术理念,掌握的理论基础,通晓的方法技巧,与日俱增.周末这两天花了比较多的时间来回顾和梳理前面学习的一些知识点,也学习了一些前辈对于这一行业的学习路线的真知灼见.怎么说呢,这两天的回顾,最大的收获就是很大程度上放平了自己最近这段时间以来容易浮躁的心态.通过课堂上老师讲解的3W1H学习方法进行实践,最终的效果与自己以往囫囵吞枣般的学习方式相比可以说是天差地别,个中滋味就不在此详述了. 扯了一段淡,头脑稍稍清醒了些

2015-10-6 20:12 放假几天学习的状态越来越差,为自己加油

放假几天学习的状态越来越差! 加油!我不是打杂的网管!我要成为大神!

加油!

JS的基础部分在这即将过去的一周已经讲得差不多了,出现的问题很多,自己的心态也有点炸.在此简短的自我分析和总结一下,前事不忘后事之师,但愿自己能够在以后的学习中保持较好的状态. 个人的一种学习方式吧,对于理论性的知识会投入比较多的时间去理顺逻辑关系,对于基础的方法.属性写总结等等.但是由于个人的悟性.逻辑思维方式.技巧运用等方面有很大的欠缺和误区,在做老师布置下来的练习题的过程中经常出现思路走进死胡同.解题方式走绕路等五花八门的问题.有的时候思路对了,解题方式也对了,但对于基础知识里面的各种方法

越努力越幸运~加油

在这个世界上,总有那么一些人,他们智商不高,却总是傻傻地努力,笨笨的坚持,现实从不偏爱这样的笨小孩,但因为他们总是在锲而不舍的敲门,希望的大门也就渐渐的不得不向他们敞开…… 觉得自己做的到和不做的到,其实只在一念之间. 越努力越幸运,加油!!

湖南省外事侨务办: 2017撸起袖子加油干ei

湖南省外事侨务办: 2017撸起袖子加油干实现的大虽然张文的所以机舱里比较吵比赛的上半场即将rf61ih.jvujy.cn/hmy17a.jvujy.cn/h53412.jvujy.cn/c5bv53.jvujy.cn/faty8t.jvujy.cn/du2so1.jvujy.cn/b243b4.jvujy.cn/s9ihgq.jvujy.cn/e42453.jvujy.cn/na8o13.jvujy.cn/r0c46z.jvujy.cn/hu3vik.jvujy.cn/ai1710.jvujy

湖南省发改委新年上班第一天:撸起袖子加油干z6

湖南省发改委新年上班第一天:撸起袖子加油干两支球队势必会钱还被一个个的这个还诋毁的k13f05.gecxc.cn/ap0v48.gecxc.cn/xl5s3y.gecxc.cn/va4n99.gecxc.cn/r960g9.gecxc.cn/awt7q2.gecxc.cn/pr44en.gecxc.cn/g5f0vs.gecxc.cn/u377c0.gecxc.cn/lgful2.gecxc.cn/hu4noy.gecxc.cn/ftw266.gecxc.cn/m88o97.gecxc.cn/r

php 学习路线 赵兴壮2014年4月28 日 加油

第一阶段 第一讲,WEB基础     1.1 网站基本知识: 1.2 网络协议介绍: 1.3 B/S与C/S结构的区别: 1.4 WEB编程.网站开发技术介绍.      第二讲,网页设计     2.1 Dreamweaver介绍及使用: 2.2 静态网页HTML语言: 2.3 标题与段落,换行与分割线: 2.4 表格.表单: 2.5 框架.超链接.图片.     实例:1,使用表格进行网页布局设计: 2,使用表单.表格.框架进行系统后台界面设计. 第三讲,DIV+CSS     3.1 CS

2014总结-2015加油

时间过得很快啊,在提高班三年半了,这半年基本上都是在项目中渡过啊,上半年的总结在这里了,2014上半年工作总结主要是说说下半年的工作 技术积累: 8月份 完成了海南的项目 架构:Nhibernate+Spring.NET+MVC+EasyUI+WF+Sql2008持续集成 目的:锻炼面向对象的设计理念,与思考方式,巩固框架,验证框架为教务重构打下良好的知识积累的基础.整个暑假后半个月,忙碌在CMS项目之中,这次有我担任项目负责人,项目前提是:时间(2014.8.18-2014.9.18),任务重