卡车在经过加油站之后需要加油时,可视为在之前经过的加油站加的油。
终点可看作距离起点为l的,油量为0的加油站。
在卡车没油的时候用优先队列提取出先前经过的加油站中油量最多的。
#include <cstdio>
#include <queue>
#include <utility>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
typedef pair<int, int> fuel;
priority_queue<int> que;
fuel sta[MAXN+2];
int main()
{
int l, p, n;
scanf("%d", &n);
int i;
for (i = 0; i < n; i++) {
scanf("%d%d", &sta[i].first, &sta[i].second);
}
scanf("%d%d", &l, &p);
for (i = 0; i < n; i++) {
sta[i].first = l - sta[i].first;
}
sta[n].first = l;
sta[n].second = 0;
n++;
sort(sta, sta + n);
int times = 0;
int pos = 0;
int tank = p;
for (i = 0; i < n; i++) {
int d = sta[i].first - pos;
while (tank - d < 0) {
if (que.empty()) {
puts("-1");
return 0;
}
tank += que.top();
que.pop();
times++;
}
tank -= d;
pos = sta[i].first;
que.push(sta[i].second);
}
printf("%d\n", times);
return 0;
}