堆 (优先队列)举例
题目:
你需要驾驶一辆卡车行驶 l 单位距离。最开始的时候,卡车上有 p 单位的汽油。卡车每开 1 单位距离需要消费 1 单位的汽油。如果在途中汽车上的汽油耗尽,卡车就无法继续前行,因而无法到达终点。在途中一共有 n 个加油站。第 i 个加油站在距离起点 ai 单位距离的地方,最多可以给卡车加 bi 单位汽油。假设卡车的燃料箱的容量是无限大的,无论加多少油都没有问题。那么问卡车是否能到达终点?如果可以,最少需要加多少汽油?如果可以到达终点,输出最少的加油次数,否则输出 -1。
示例:
n = 4
l = 25
p = 10
a = { 10, 14, 20, 21 }
b = { 10, 5, 2, 4 }
输出 2
// CreateTime: 2015-04-08 13:27:16 #include <iostream> #include <queue> using namespace std; // priority_queue <int, vector<int>, greater<int> > que; // 最小堆 priority_queue<int> que; // 最大堆 int l; // 路的长度 int n; const int maxn = 10005; int a[maxn]; // 加油站到起点的距离 int b[maxn]; // 加油站可以加的油 int ans; int p; // 刚开始的时候汽车有多少油 void solve() { ans = 0; int pos = 0; int tank = p; // 目前的油 for (int i = 0; i <= n; i++) { int d = a[i]- pos; while (tank < d) { // 需要加油 if (que.empty()) { cout << "-1" << endl; return; } tank += que.top(); que.pop(); ans++; } tank = tank - d; // 不需要继续加油了 que.push(b[i]); pos = a[i]; } } int main(void) { cin >> n >> l >> p; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; } a[n] = l; b[n] = 0; solve(); cout << ans << endl; return 0; }