#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