首页 > 代码库 > poj 2431 优先队列,贪心

poj 2431 优先队列,贪心

题意:从当前位置到目的地,给出初始油量和距离,给出一系列的加油站离终点的距离和可以加的油量,每走一个单位消耗一个单位油量,求要到达目的地最少要在几个加油站下车加油。

题解:既然是最少,那么尽可能在油消耗完的时候给加油,如果再走a米的路程中注定要加一次油,那么就选择这段路程油量最大的加油站下车

代码实现就是每经过一个加油站将这个加油站的油量存下来, 等到不得不下车加油的时候,就选择储存的这些数据中最大的那个(不一定是在油刚刚消耗完的时候,在那之前也行),并且选择完了以后将这个数据移出。直到到达目的地。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct Node
{
    int num;
    Node* next;
};
struct Point
{
    int dist;
    int fuel;
};
Node *root;
int n;
int L, res;
void input(Node *a)
{
    Node *beg = root;
    while(beg->next != NULL && beg->next->num >= a->num) beg = beg->next;
    a->next = beg->next;
    beg->next = a;
}
bool cmp(const Point a, const Point b)
{
    if(L - a.dist != L - b.dist) return L - a.dist < L - b.dist;
    return a.fuel < b.fuel;
}
Node *newnode(){return (Node*)malloc(sizeof(Node*));}
int main()
{
    while(scanf("%d", &n) != EOF)
    {
        root = (Node *)malloc(sizeof(Node *));
        root->num = 0xffffff;
        root->next = NULL;
        Point p[10005];
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d", &p[i].dist, &p[i].fuel);
        }

        scanf("%d%d", &L, &res);
        sort(p, p + n, cmp);
        Node *n0 = newnode();
        n0->num = res;
        input(n0);
        int ii = 0;
        int cango = 0;
        int ans = -1;
        while(root->next != NULL)
        {
            Node *n1 = root->next;
            root->next = n1->next;
            cango += n1->num;
            //printf("cango = %d\n", cango);
            ans++;if(cango >= L)break;

            for(; L - p[ii].dist <= cango; ii++)
            {
                Node *n0 = newnode();
                n0->num = p[ii].fuel;
                input(n0);
            }
        }
        if(cango < L) cout << "-1" << endl;
        else printf("%d\n", ans);

    }
}

可以用c++中的容器优先队列

priority_queue。

 

poj 2431 优先队列,贪心