题意: 一辆车在长为L的一条线上行驶, 每走1步耗费1单位油, 初始油量为P, 线上共N个加油站, 给出每座加油站的油量和距离终点的距离, 假设油箱无限大, 求得到达终点时的最少加油次数, 无法到达则输出-1
题解: 对于这道题我们需要转换一些基本的思路, 在到达加油站i时, 其实就可以认为获得了一次在i之后的任何时候都可以加油
的机会
接下来再运用一下贪心的思想, 我们只在没油的时候加油, 而且一旦加油就加最大的
即可, 如果某次无法加油, 则无法到达.
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef long long LL;
const LL maxn = 1e4+10;
struct node{
int x, f;
}a[maxn];
bool cmp(node a, node b) {return a.x < b.x;}
int n, l, p;
priority_queue<int> q;
int main()
{
cin >> n;
for(int i = 1;i <= n; i++)
cin >> a[i].x >> a[i].f;
cin >> l >> p;
//距终点转换成距起点
for(int i = 1; i <= n; i++)
a[i].x = l-a[i].x;
sort(a+1, a+1+n, cmp);
a[n+1].x = l, a[n+1].f = 0; //把终点也作为加油站
int tank = p, ans = 0, pos = 0;
for(int i = 1; i <= n+1; i++){
int d = a[i].x-pos; //当前要走的距离
while(d > tank){
if(q.empty()){
cout << "-1" << endl;
return 0; //无法达到则油量不够
}
tank += q.top();
q.pop();
ans++;
}
tank -= d;
pos = a[i].x;
q.push(a[i].f);
}
cout << ans << endl;
return 0;//
}