poj 2431 Expedition

原题链接 :http://poj.org/problem?id=2431

题目大意 : 一辆车从a出发到b,路上有n个加油站,给出加油站距离终点的距离和可以加的油,求最少加油次数。(车可以加无限多油)

思路: 用优先队列,每到一个地点就把加油站的油加入队列,当油不够到下一个节点时,从队列中选取最大的加油。

代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
using namespace std;
struct node {
int a,b;
}a[10005];
bool cmp(node x,node y)
{
    return x.a>y.a;
}
priority_queue <int> res; 
int main ()
{
    int n,m,i,t,j,k,sum=0;;
    scanf("%d",&n);
    for(i=0;i<n;++i)
        scanf("%d %d",&a[i].a,&a[i].b);
    scanf("%d %d",&j,&k);
    sort(a,a+n,cmp);
    a[n].a=0; a[n].b=0;  ///将终点定义为距离为 0 油量为 0 的加油站
    for (i=0;i<=n;++i)
    {
        if (j-a[i].a<=k) ///判断是否能到达当前加油站
        {
            res.push(a[i].b);
            k=k-j+a[i].a;
            j=a[i].a;
        }
        else
        {
            sum++;
            ///如果不能到达,加油次数加一; i-- 重新进行上一步判断
            if (!res.empty()){
                k+=res.top();
                res.pop();
                i--;
            }
            else
                break;
        }
    }
    if (j==0) 
        printf("%d
",sum);
    else
        printf("-1
");

    return 0;
}
原文地址:https://www.cnblogs.com/blowhail/p/11165072.html