zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    JQ分页练习
    Dom1
    JQ轮播图
    Dom操作
    DYR
    jQ点击事件
    [z]vc boost安装
    [z] .net与java建立WebService再互相调用
    [z]
    git常用命令二
  • 原文地址:https://www.cnblogs.com/blowhail/p/11165072.html
Copyright © 2011-2022 走看看