EOJ 1855 Solution Report - Expedition
来源:互联网 发布:vnc server windows 编辑:程序博客网 时间:2024/05/22 15:02
原文地址:http://linus-young.github.io/blog/2014/04/15/eoj-1855-solution-report-expedition/
keywords: 贪心
,堆
(优先队列
)
1. 题目描述
原题地址: EOJ 1855
又是奶牛……
一群奶牛开了一辆漏油车想去一个最近的 town (每行驶一公里漏一升油),离最近 town 的距离为 L
公里, 最初的油量为 P
, 在开往 town 的途中有 N
个加油站(每个加油站的油量是 1~100 L)。
求奶牛们为了开到 town, 最少需要在几个加油站停下来加油。 如果不可能到达 town,则输出 -1。 但比较神奇的是:这辆卡车可装的油量没有上限。。。
Note:
2. 解题思路
解法一 O(n^2)
一开始想的是按照贪心的思想,每次在当前能达到的范围内找油量最多的加油站。
思想是对的,但我想错了,没考虑到每次取最多的,到了最后的话可能油量还不够,又要往回取油量次小的加油站。这样一想一想就昏了,为什么不先排个序啊!!排完序不就可以按照大小顺序取了么。
排序的规则是:
若两个加油站油量相同,则取离起点远的,否则取油量多的。
用 struct 结构体来记录每个加油站的距离(dis)和 油量(fuel), 并将所有的加油站存到一个 vector 中,排序后,卡车上的总油量(total_fuel)初始化为 P,每加一次油就会增加相应的油量,从第一个开始取,若在可取的范围内 (total_fuel > L - dis
),则 total_fuel 增加,并从 vector 中删除该节点。取了该点后判断是否有 total_fuel == L
,若成立则返回节点数,否则又从头开始取(因为刚刚最大的已经删掉了),若第一个不是在可取的范围内,也就是说 total_fuel 没有增加,那么就说明不能到达 town, 返回 -1。
需要注意的地方有:
题目给的是每个加油站到 town 的距离,而非加油站离起点的距离
题目给的加油站到 town 的距离不一定是排好序的(虽然这个跟本解法没多大关系)
解法二 O(nlogn)
用堆(优先队列)来维护油量
pop_heap
将 front(即第一个最大元素)移动到 end 的前部,同时将剩下的元素重新构造成 (堆排序) 一个新的 heap。
push_heap
对刚插入的(尾部)元素做堆排序。
代码如下:O(
版本二:O(nlogn)
- EOJ 1855 Solution Report - Expedition
- EOJ 1852 Solution Report --Ordered Fractions
- EOJ 2067 Solution Report - Building Roads
- EOJ 1488 Solution Report - Coin Collector
- EOJ 1824 Solution Report - 数塔 III
- POJ 3253 Solution Report
- POJ 1160 Solution Report
- Expedition
- Expedition
- Expedition
- Expedition
- Expedition
- Expedition
- Expedition
- acm ural [1066] Garland solution report
- EOJ
- EOJ
- EOJ
- 大学生活
- Qt学习之路(22): 事件过滤器
- mac上php+nginx配置
- ligerui V1.2.3中去掉了实体绑定获取全部问题!
- 将Ogre写入MFC框架中
- EOJ 1855 Solution Report - Expedition
- 如何检测内存泄露
- GridCtrl使用详解
- Qt学习之路(23): 自定义事件
- POJ 3616 Milking Time(简单DP)
- 如何更好地限制一个UITextField的输入长度
- 解决Win7-IE11保护模式下跨域写cookie的问题
- 设计模式--中介者模式Mediator(行为型)
- 把C盘格式化过,后来发现运行不了JAVA,是怎么回事?