优先队列的使用——Expedition
一、题目描述
你需要驾驶一辆卡车行驶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的更多相关文章
- 优先队列 POJ 2431 Expedition
题目传送门 题意:一辆卡车要行驶L长度,初始有P油,每行驶一个单位长度消耗一单位油.有n个加油站可以加油,问最少加油几次才能行驶L长度,如果不能输出-1 分析:按照挑战书的解法,每走到一个加油站相当于 ...
- poj 3431 Expedition 优先队列
poj 3431 Expedition 优先队列 题目链接: http://poj.org/problem?id=2431 思路: 优先队列.对于一段能够达到的距离,优先选择其中能够加油最多的站点,这 ...
- H - Expedition 优先队列 贪心
来源poj2431 A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being ...
- POJ 2431 Expedition (优先队列+贪心)
题目链接 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. ...
- 【POJ - 2431】Expedition(优先队列)
Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离 ...
- poj 2431 Expedition 贪心+优先队列 很好很好的一道题!!!
Expedition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10025 Accepted: 2918 Descr ...
- POJ 2431 Expedition(优先队列、贪心)
题目链接: 传送门 Expedition Time Limit: 1000MS Memory Limit: 65536K 题目描述 驾驶一辆卡车行驶L单位距离.最开始有P单位的汽油.卡车每开1 ...
- poj - 2431 Expedition (优先队列)
http://poj.org/problem?id=2431 你需要驾驶一辆卡车做一次长途旅行,但是卡车每走一单位就会消耗掉一单位的油,如果没有油就走不了,为了修复卡车,卡车需要被开到距离最近的城镇, ...
- POJ2431 Expedition(排序+优先队列)
思路:先把加油站按升序排列. 在经过加油站时.往优先队列里增加B[i].(每经过一个加油站时,预存储一下油量) 当油箱空时:1.假设队列为空(能够理解成预存储的油量),则无法到达下一个加油站,更无法到 ...
随机推荐
- 14.oauth2与open id connect 对比
微博的授权机制 openIdConnect
- HDU - 1016 Prime Ring Problem 经典素数环
Prime Ring Problem A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., ...
- HTML学习笔记(五)框架
框架 通过使用框架,可以在同一个浏览器窗口中显示多个页面. eg: <frameset rows="50%,50%"> <frame src="/exa ...
- 线程通讯--BlockingQueue
Producer线程 package com.thread.communication.blockingqueue; import java.util.concurrent.BlockingQueue ...
- Weekly Contest 111-------->944. Delete Columns to Make Sorted
We are given an array A of N lowercase letter strings, all of the same length. Now, we may choose an ...
- 怎么解决UIScrollView把uitableviewcell的点击事件屏蔽了
[self.contentView addSubview:self.scrollView]; self.scrollView.userInteractionEnabled = NO; [self.co ...
- 用vector实现普通平衡树 By cellur925
其实我真的很想学习手写平衡树的==.但是感觉联赛前真没有时间了(太菜了.),于是先学一个STL代用苟,如果还能继续在\(tsoi\)苟,回来一定先学平衡树=w=. 然后因为窝对STL用的不是特别好,有 ...
- 用css固定textarea文本域大小尺寸
textarea元素在chrome等浏览器下可以被拖拉从而改变大小,对于查看textarea里面的内容来说相当方便,但是有时候 我们为了保持网页的美观,不得不想要禁掉这个功能,禁止用户随意拉动text ...
- bzoj 4318 || 洛谷P1654 OSU!
https://www.lydsy.com/JudgeOnline/problem.php?id=4318 https://www.luogu.org/problemnew/show/P1654 看来 ...
- [已读]CSS禅意花园
蛮早的一本书,提到了一些小tip,比如负margin实现居中.FIR图像替换.