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
    







  • 相关阅读:
    Python Scarpy安装包
    pip install 出现报asciii码错误的问题
    pyhton 27 pip命令无法使用 没有Scripts文件夹 的解决方法
    北漂
    15再见,16你好。
    selenium By.xpath 用法
    java.util.NoSuchElementException解决办法
    Android版之数据库增删改查图书信息
    Android studio连接sqlserver数据库
    Android简易版图书管理系统
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5098673.html
Copyright © 2011-2022 走看看