編程演算法 - 遠征隊(expedition) 代碼(C)

來源:互聯網
上載者:User

標籤:mystra   編程演算法   遠征隊   汽車加油   堆   

遠征隊(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個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.