poj2431Expedition(贪心,优先队列)

来源:互联网 发布:风水罗盘软件安卓版 编辑:程序博客网 时间:2024/05/21 21:00

题意

有一辆车,要开l的路,它每开一单位的路要消耗一单位的油。车里原来有p的油,车的油箱容量是无限大的。现在路上不同位置有一些加油站,这些加油站里有一定量的油,问开到终点最少要加几次油。

思路

我们肯定尽量加多一点的油,那么我们这样考虑,假如我经过一个加油站,我就获得了加这个站的油的权利,那么我可以一直走,一直走到没油,这时候取出我前面能加的油里面最多的那个加上继续走

代码

#include <cstdio>#include <iostream>#include <queue>#include <algorithm>using namespace std;const int kMaxn = 10000 + 10;struct aa {    int d,v;}a[kMaxn];bool cmp(aa x, aa y) {    return x.d < y.d;}int main() {    int n;    while(~scanf("%d", &n)) {        for(int i = 1; i <= n; i++)            scanf("%d %d", &a[i].d, &a[i].v);        int l,p;        scanf("%d %d", &l, &p);        for(int i = 1; i <= n; i++)            a[i].d = l - a[i].d;        sort(a + 1, a + 1 + n, cmp);        n++;        a[n].d = l;        priority_queue<int>Q;        int pos = 0;        bool flag = true;        int sum = 0;        for(int i = 1; i <= n; i++) {            p = p - (a[i].d - pos);            pos = a[i].d;            while(p < 0) {                if(Q.empty()) {                    flag = false;                    break;                }                p += Q.top();                Q.pop();                sum++;            }            if(!flag)                break;            Q.push(a[i].v);             }        if(!flag)            printf("-1\n");        else             printf("%d\n", sum);    }    return 0;}
0 0
原创粉丝点击