编程算法 - 远征队(expedition) 代码(C)
来源:互联网 发布:你见过最贱的人 知乎 编辑:程序博客网 时间:2024/05/17 09:27
远征队(expedition) 代码(C)
本文地址: http://blog.csdn.net/caroline_wendy
题目: 远征队有一辆卡车需要行驶L单位的距离, 开始时, 车上有P单位的汽油, 每开1单位需要1单位的汽油.
途中有N个加油站A, 每个加油站能加油B, 油箱容量无限大, 如果能到达终点, 求最小加油次数.
例如: 需要行驶L=25的距离, 起始有P=10单位汽油, 有N=4个加油站,
加油站到起始位置的距离A={10, 14, 20, 21}, 可以加的汽油B={10,5,2,4},
则result=2, 在(10,10) (14,5)处加油, 即加了15, 起始10, 行驶25.
使用堆(heap), 即优先级队列(priority_queue)进行求解.
在到达加油站i时, 就获得了一次在之后的任何时候都可以加B单位汽油的权利.
在每次到达加油站之前判定, 是否需要加前面的汽油, 时间复杂度O(nlogn).
代码:
/* * main.cpp * * Created on: 2014.7.20 * Author: spike *//*eclipse cdt, gcc 4.8.1*/#include <stdio.h>#include <queue>#include <vector>#include <functional>using namespace std;class Program {static const int MAX_N = 100;int L=25, P=10, N=4;int A[MAX_N+1] = {10, 14, 20, 21}, B[MAX_N+1] = {10, 5, 2, 4};public:void solve() {A[N] = L; //终点也当作一个加油站B[N] = 0;N++;priority_queue<int> que;int ans = 0, pos = 0, tank =P;for (int i=0; i<N; ++i) {int d= A[i]-pos;while (tank-d<0) {if (que.empty()) {puts("-1\n");return;}tank += que.top();que.pop();ans++;}tank -= d;pos = A[i];que.push(B[i]);}printf("result=%d\n", ans);} };int main(void){Program iP;iP.solve();return 0;}
输出:
result=2
3 0
- 编程算法 - 远征队(expedition) 代码(C)
- 远征expedition
- 编程算法 - 快速排序算法 代码(C)
- 编程算法 - 字符串的排列 代码(C)
- 编程算法 - 丑数 代码(C)
- 编程算法 - 左旋转字符串 代码(C)
- 编程算法 - 扑克牌的顺子 代码(C)
- 编程算法 - 部分和问题 代码(C)
- 编程算法 - 水洼的数量 代码(C)
- 编程算法 - 硬币问题 代码(C)
- 编程算法 - 区间调度问题 代码(C)
- 编程算法 - 背包问题(递归) 代码(C)
- 编程算法 - 完全背包问题 代码(C)
- 编程算法 - 划分数 代码(C)
- 编程算法 - 堆(heap) 代码(C)
- 编程算法 - 二分图判定 代码(C)
- 编程算法 - 链表逆序 代码(C)
- 编程算法 - 旋转矩阵 代码(C)
- 【linux】利用patch和diff命令制作文件补丁
- vs2010统计项目代码总行数
- poj 1083
- 趣味游戏的优点和缺点玩网络趣味游戏
- Java readLine()读取文件,按行读取一次一行
- 编程算法 - 远征队(expedition) 代码(C)
- linux多网卡某个启动失败原因
- 安卓中如何为listview添加背景
- [算法6]fast-sort算法
- androiid从相册获取图片,解决小米获取不到图片问题
- 蚊子132内容为自己的推理认知+网络
- 如何删除ActiveX控件
- 公司注册不满一年如何名称变更
- 图解DIY 1pA超微电流测试器