POJ2431 优先队列+贪心

题目大意:

见《挑战程序设计竞赛》P74。

我的理解:

优先队列+贪心

注意把输入的距离(加油站到终点)改为起点到加油站。

因为求得是最优解,需要尽可能少的加油站,所以我们每次希望去加油的时候 加最大的那个,因而将加油站push进priority_queue(堆结构,默认每次弹出最大值)

在到达加油站 i 时,就获得了一次在之后的任何时候都可以在加 stop[i].second 单位汽油的权利。

#include<iostream>
#include<queue>
using namespace std;
const int maxn = 10000 + 10;

typedef pair<int, int> P;
int L, p, N;
P stop[maxn];

int cmp(P p1, P p2) {
    return p1.first < p2.first;
}

void solve() {
    //技巧
    stop[N].first = L;
    stop[N].second = 0;
    N++;
    priority_queue<int> que;
    int ans = 0, pos = 0, tank = p;
    for (int i = 0; i < N; i++) {
        int d = stop[i].first - pos;
        while (tank - d < 0) {
            if (que.empty()) {
                puts("-1");
                return;
            }
            tank += que.top();
            que.pop();
            ans++;
        }
        tank -= d;
        pos = stop[i].first;
        que.push(stop[i].second);
    }
    cout << ans << endl;
}


int main()
{
    //freopen("in.txt", "r", stdin);
    while (scanf("%d", &N) != EOF) {
        for (int i = N - 1; i >= 0; i--) {
            cin >> stop[i].first >> stop[i].second;
        }
        cin >> L >> p;
        for (int i = 0; i < N; i++) {
            stop[i].first = L - stop[i].first;
            //cout<<A[i]<<" "<<B[i]<<" ";
        }
        sort(stop, stop + N, cmp);
        solve();
    }
    return 0;
}
posted @ 2020-06-09 16:31  RioTian  阅读(120)  评论(0编辑  收藏  举报