【树的算法】之求最少加油次数

#include <iostream>
#include <queue>
using namespace std;
/**
 * 原题:一辆卡车需要行驶L单位的距离,开始时卡车有P单位的汽油,每开1单位距离会消耗1单位汽油。
 * 汽油耗尽就无法再行驶,已知一路上有N个加油站,第i个加油站距离起点A[i]个单位,并且可供B[i]单位的汽油。
 * 假设卡车的燃料箱可以容纳无限的汽油。问:该卡车是否可以到达终点,如果可以,输出最小要加多少次油,否则输出-1
 */
#define L 25
#define P 10
#define N 4

static int A[N+1] = {10,14,20,21};
static int B[N+1] = {10, 5, 2, 4};

/**
 * 思路:
 * 可以用优先队列来解决(c++的优先队列取出的是最大值)
 */
void solve(){

    //为了方便计算,把终点也当成加油站
    A[N] = L;
    B[N] = 0;

    int tank = P;       //燃料箱剩余汽油量
    int addTime = 0;    //加汽油的次数
    int pos = 0;        //当前离起点的距离

    priority_queue<int> que;

    for (int i = 0; i <= N; ++i) {

        int distance = A[i] - pos;
        tank -= distance;
        while (tank < 0){
            if (que.empty()){
                cout << "-1" << endl;
                return;
            }
            tank += que.top();
            que.pop();
            addTime++;
        }
        que.push(B[i]);
        pos += distance;
    }
    cout << addTime << endl;
}

int main() {
    solve();
    return 0;
}

运行结果:

2



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章