编程算法

远征队(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
");
					return;
				}
				tank += que.top();
				que.pop();
				ans++;
			}
			tank -= d;
			pos = A[i];
			que.push(B[i]);
		}
		printf("result=%d
", ans);
	}
 };


int main(void)
{
	Program iP;
	iP.solve();

	return 0;
}



输出:

result=2







原文地址:https://www.cnblogs.com/gcczhongduan/p/5098673.html