zoukankan      html  css  js  c++  java
  • 编程算法

    远征队(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
    







  • 相关阅读:
    javascript初识
    css定位及叠放次序
    css精灵图
    css元素的显示及隐藏、文字隐藏
    css浮动
    盒子模型的边框、内边距、外边距、阴影
    css背景
    css中的显示与隐藏
    css定位
    css的布局与版心布局
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5098673.html
Copyright © 2011-2022 走看看