一、题目描述

你需要驾驶一辆卡车行驶L单位距离。最开始时,卡车上有P单位的汽油。卡车每开1单位距离需要消耗1单位的汽油。如果在途中车上的汽油耗尽,卡车就无法继续前行,因而无法到达终点。中途共有N个加油站,第i个加油站距离终点Ai单位距离,最多可以给卡车加Bi单位汽油。假设卡车的燃料箱的容量是无限大的,无论加多少油都没有问题。那么请问卡车是否能到达终点?如果可以,最少需要加多少次油?如果不可以输出-1。(1 ≤ N ≤ 10000,1 ≤ L ≤ 1000000,1 ≤ P ≤ 1000000,1 ≤ Ai ≤ L,1 ≤ Bi ≤ 100)

二、问题分析

由于加油站的数量非常大,必须像一个高效的解法。

在卡车开往终点的途中,只有在加油站才可以加油。我们换一种思考方式,如果认为“在到达加油站时i时,再次之后的任何时候都获得了加Bi油的权利”。因为希望到达终点的加油次数尽可能地少,我们可以加经过地加油站的加油量放入优先队列,当油量不足以到达下一站,则取出优先队列中的最大值,其实就是贪心算法,取所有权力中的最大值,最坏的情况时,每次油量都不够,需要从队列中取,此时时间复杂度O(nlogn).

三、代码实现

 #include<stdio.h>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std; const int maxn = + ;
struct Station
{
int pos;
int fuel;
bool operator < (const Station &n)const {
return (pos < n.pos);
}
}sta[maxn];
int n, L, P; void slove()
{
//把终点也认为是一个加油站,写起来更加方便
sta[n].pos = L;
sta[n].fuel= ;
n++; priority_queue<int>que;
int ans = ,pos = , tank = P; //pos表示当前位置,tank表示当前油量 sort(sta, sta + n); //使各加油站的位置从小到大排列 for (int i = ; i < n; i++)
{
int d = sta[i].pos - pos; //油量不够则加油
while (tank - d < )
{
if (que.empty())
{
printf("-1\n");
return;
}
tank += que.top();
que.pop();
ans++;
}
tank -= d;
pos = sta[i].pos;
que.push(sta[i].fuel);
}
printf("%d\n", ans);
}
int main()
{
scanf("%d", &n);
for (int i = ; i < n; i++)
scanf("%d%d", &sta[i].pos, &sta[i].fuel);
scanf("%d%d", &L, &P);
for (int i = ; i < n; i++)
sta[i].pos = L - sta[i].pos; slove();
return ;
}

四、总结

熟练应用优先队列能很好的解决许多问题。

优先队列的使用——Expedition的更多相关文章

  1. 优先队列 POJ 2431 Expedition

    题目传送门 题意:一辆卡车要行驶L长度,初始有P油,每行驶一个单位长度消耗一单位油.有n个加油站可以加油,问最少加油几次才能行驶L长度,如果不能输出-1 分析:按照挑战书的解法,每走到一个加油站相当于 ...

  2. poj 3431 Expedition 优先队列

    poj 3431 Expedition 优先队列 题目链接: http://poj.org/problem?id=2431 思路: 优先队列.对于一段能够达到的距离,优先选择其中能够加油最多的站点,这 ...

  3. H - Expedition 优先队列 贪心

    来源poj2431 A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being ...

  4. POJ 2431 Expedition (优先队列+贪心)

    题目链接 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. ...

  5. 【POJ - 2431】Expedition(优先队列)

    Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离 ...

  6. poj 2431 Expedition 贪心+优先队列 很好很好的一道题!!!

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10025   Accepted: 2918 Descr ...

  7. POJ 2431 Expedition(优先队列、贪心)

    题目链接: 传送门 Expedition Time Limit: 1000MS     Memory Limit: 65536K 题目描述 驾驶一辆卡车行驶L单位距离.最开始有P单位的汽油.卡车每开1 ...

  8. poj - 2431 Expedition (优先队列)

    http://poj.org/problem?id=2431 你需要驾驶一辆卡车做一次长途旅行,但是卡车每走一单位就会消耗掉一单位的油,如果没有油就走不了,为了修复卡车,卡车需要被开到距离最近的城镇, ...

  9. POJ2431 Expedition(排序+优先队列)

    思路:先把加油站按升序排列. 在经过加油站时.往优先队列里增加B[i].(每经过一个加油站时,预存储一下油量) 当油箱空时:1.假设队列为空(能够理解成预存储的油量),则无法到达下一个加油站,更无法到 ...

随机推荐

  1. now code寒假练习赛2——处女座的砝码(找规律题+高精度题)

    #include <bits/stdc++.h> #define ll long long using namespace std; int main() { long double n ...

  2. unity模型法线反转问题

    fbx模型导入unity正常 但只要绑了骨骼,在3dmax中正常,进入unity就法线反转 原因是3dmax中模型用到复制和镜像的导出需要多一步处理 1重置变换 2反转法线 按顺序进行这两个,在绑定模 ...

  3. [Xcode 实际操作]一、博主领进门-(5)检测运行中的模拟器在各个方向上的切换

    目录:[Swift]Xcode实际操作 本文将演示Xcode的设备模拟器在各个方向上的切换和检测. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 检测运行中的模拟 ...

  4. mysql之SQL入门与提升(四)——终结篇,函数

    一.SQL Aggregate (聚合)函数 SQL Aggregate 函数计算从列中取得的值,返回一个单一的值. AVG() - 返回平均值 COUNT() - 返回行数 FIRST() - 返回 ...

  5. F - Balanced Number

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...

  6. 怎么快速对DB里的所有email进行校验

    问题 由于业务上的需求,重新改写了校验email的正则表达式,同时DB里又迁移了其他数据库的数据,现在需要重新对DB里的所有email再校验一次,以排除掉不合法的email. DB里的数据很多,手动去 ...

  7. JQuery | trigger() 方法

    trigger() 方法触发被选元素的指定事件类型. 语法格式: trigger(type,[data]) type:触发事件类型 [data]:可选项,表示在触发事件时传递给函数的附加参数. 实例: ...

  8. Codeforces Round #541 (Div. 2) B.Draw!

    链接:https://codeforces.com/contest/1131/problem/B 题意: 给n次足球比分,求存在平局的机会. 思路: 结构体存储,unique后,判断是否有分数交叉. ...

  9. 2017"百度之星"程序设计大赛 - 初赛(A)今夕何夕

    Problem Description 今天是2017年8月6日,农历闰六月十五. 小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨. 为了排遣郁结,它决定思考一个数学问题:接下来最 ...

  10. 利用HttpClient4访问网页

    一.HttpClient介绍 虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是它没有提供足够的灵活性和其他应用程序需要的功能.HttpClient 是 Apac ...