思路: 1.让车一直走,走到没油才开始加油.
2.开始加油加最多的油.
此问题为贪心问题。
代码:
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstdio>
bool cmp(const std::pair<int, int> &a, const std::pair<int, int> &b) {
return a.first > b.first;
}
int get_minimum_stop(int L, int P, std::vector<std::pair<int, int> > &stop) {
int curr_capacity = P; // 当前油量
int result = 0; // 加油次数
std::priority_queue<int> Q; // 用最大堆存储油量
stop.push_back(std::make_pair(0, 0));
std::sort(stop.begin(), stop.end(), cmp);
for (int i = 0; i < stop.size(); i++) {
int dis = L - stop[i].first;
while (curr_capacity < dis && !Q.empty()) { // 燃料不够距离,开始加油
curr_capacity += Q.top();
Q.pop();
result++;
}
if (Q.empty() && curr_capacity < dis) // 油加完了还不够,说明到不了
return -1;
curr_capacity -= dis;
L = stop[i].first;
Q.push(stop[i].second);
}
return result;
}
int main() {
std::vector<std::pair<int, int> > stop;
int N, L, P, distance, fuel;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d %d", &distance, &fuel);
stop.push_back(std::make_pair(distance, fuel));
}
scanf("%d %d", &L, &P);
printf("%d\n", get_minimum_stop(L, P, stop));
return 0;
}