Expedition POJ - 2431 (优先队列 贪心)

在这里插入图片描述

题意: 一辆车在长为L的一条线上行驶, 每走1步耗费1单位油, 初始油量为P, 线上共N个加油站, 给出每座加油站的油量和距离终点的距离, 假设油箱无限大, 求得到达终点时的最少加油次数, 无法到达则输出-1

题解: 对于这道题我们需要转换一些基本的思路, 在到达加油站i时, 其实就可以认为获得了一次在i之后的任何时候都可以加油 B i B_i 的机会
接下来再运用一下贪心的思想, 我们只在没油的时候加油, 而且一旦加油就加最大的 B i B_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;//
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/87003185