练习题 No.15 Expedition

来源:互联网 发布:java socket链接不上 编辑:程序博客网 时间:2024/06/02 06:32

要求

你需要驾驶一辆卡车行驶L单位距离。最开始时,卡车上有P单位的汽油。卡车每开1单位消耗1单位的汽油。如果在途中卡车上的汽油耗尽,卡车就无法继续前行,因而无法到达终点。在途中一共有N个加油站。第i个加油站在距离起点Ai的距离,最多可以给卡车加Bi的汽油。卡车油箱无限大。请问卡车是否可以到达终点,如果可以请输入最少在几个加油站加油,如果不可以则输出-1

限制条件

  • 1 <= N <= 10000
  • 1 <= L <= 1000000
  • 1 <= P <= 1000000
  • 1 <= Ai < L
  • 1 <= Bi <= 100

输入格式

第一行输入N L P
接下来N行输入Ai
接下来N行输入Bi

输出格式

输出结果

测试输入

4 25 10
10 14 20 21
10 5 2 4

测试输出

2

解题思路

使用最大堆,利用贪心法即可。
每次路过加油站,则将加油站可以加的油都记起来,最后没油的时候再使用最大的油,记为加了一次油。

代码

#include <iostream>#include <queue>using namespace std;  #define MAX_N 100001int main() {    int L, P, N;    int A[MAX_N] = {0};    int B[MAX_N] = {0};    cin >> N >> L >> P;    for (int i = 0; i < N; i++) {        cin >> A[i];    }    for (int j = 0; j < N; j++) {        cin >> B[j];    }    A[N] = L;    B[N] = 0;    N++;    priority_queue<int> que;    int ans = 0;    int pos = 0;    int tank = P;    for (int i = 0; i < N; i++) {        int d = A[i] - pos;        while (tank - d < 0) {            if (que.empty()) {                cout << "-1";                return 0;            }            tank += que.top();            que.pop();            ans++;         }        tank -= d;        pos = A[i];        que.push(B[i]);    }     cout << ans << endl;    return 0;  }
0 0
原创粉丝点击