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

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

注意,priority_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

CNUOJ 0576 加油的更多相关文章

  1. poj 3635/hdu 1676 Full Tank? 车辆加油+最短路

    http://acm.hdu.edu.cn/showproblem.php?pid=1676 给出一张图,n<=1000,m<=10000. 有一辆车想从图的一个地方到达另外一个地方,每个 ...

  2. 省选加油>_<

    今天没有写题诶……看了看以前的模板……明天就要省选了>_<加油~~ 要不再去打局dota吧>_>

  3. 大四找实习(web前端),加油

    大四很奇妙,课程变少了,事情却繁杂了. 大三暑假去学驾照,在很多人看来太迟了(毕竟身边很多人跑去实习了),包括我自己.学驾照特别费时间,尤其是对即将大四,希望用实习充实自己的我来说.考虑再三,终于决定 ...

  4. 给自己加油,一定要学会MFC!

    我自己对于没有学会MFC始终耿耿于怀,都什么时代了啊,但是我仍然坚持会去学MFC,因为MFC虽然落后与复杂,但是在Windows平台上仍然是无所不能的(其实Windows平台仍然是唯一可以赚钱的平台, ...

  5. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  6. N年之后,只记得三井寿!而我们程序猿们也要加油珍惜时间!

    [感觉程序员看一篇励志文章效果大于6篇技术文章,3份源码下载.....所以上此文] [说明:本文不少段落是摘自别人文章,因为本人写程序的文笔有限,怕感动不了大家,所以摘取了不错的部分] 前段时间重新看 ...

  7. 今天就这么乱糟糟的过啦~刚刚接触html,就稍微写了一下,明天加油,今天直接贴图

    2015-01-01 <!DOCTYPE HTML> <html> <head> <meta charset = "gb2312"> ...

  8. 省钱加油(Fuel Economy)题解

    题目 农夫约翰决定去做一个环游国家旅行,为了不让他的奶牛们感到孤单,于是他决定租一辆货车带领他的奶牛们一起去旅行.这辆货车的油箱最多可以承载G 个单位的油,同时为了简化问题,规定每一个单位的油可以行使 ...

  9. 撸起袖子加油干 golang入坑系列

    还是提醒一下,里面有段子,不都是技术. 冲着技术来的,慢走不送.没有版权,但可以给我发邮件(ztao8607@gmail.com) 在我的发小朋友中,终于最后一位打光棍的要结婚了. 说实话,真心不容易 ...

随机推荐

  1. Linux进程间通信(一): 信号 signal()、sigaction()

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  2. 一个asp采集程序

    <% if request.QueryString="" then url="http://www.hbcz.gov.cn:7001/XZQHQueryWAR/xx ...

  3. 字符串匹配:KMP算法

    一.原理: KMP算法是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法.朴素算法( ...

  4. stack.sh failing giving error "g-api did not start"

    same issue i faced , tried with ./unstack.sh and ./clean.sh also but couldn't fix the issue.Followin ...

  5. java22

    1:登录注册IO版本案例(掌握) 要求,对着写一遍. cn.itcast.pojo User cn.itcast.dao UserDao cn.itcast.dao.impl UserDaoImpl( ...

  6. java.lang.IllegalStateException: getOutputStream() has already been called for this response

    ERROR [Engine] StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exceptionjava.lang ...

  7. myeclipse6.5注册机

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  8. .Net中使用无闪刷新控件时提示框不显示

    今天做提示框的时候一直不显示,让我郁闷好久,晚上吃饭的时候问了同事一下,他给了一个思路, 他说可能是因为由于页面中的无闪刷新导致的结果:百度了一下真找到了解决方法 在页面中存在无闪刷新控件的时候提示框 ...

  9. mysql缓存

    <cache/>字面上看就是这样.这个简单语句的效果如下: 映射语句文件中的所有 select 语句将会被缓存. 映射语句文件中的所有 insert, update 和 delete  ...

  10. 线性回归、梯度下降(Linear Regression、Gradient Descent)

    转载请注明出自BYRans博客:http://www.cnblogs.com/BYRans/ 实例 首先举个例子,假设我们有一个二手房交易记录的数据集,已知房屋面积.卧室数量和房屋的交易价格,如下表: ...