首页 > 代码库 > 编程算法 - 远征队(expedition) 代码(C)
编程算法 - 远征队(expedition) 代码(C)
远征队(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
编程算法 - 远征队(expedition) 代码(C)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。