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

题解

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;

;
int N,L,P; //N是加油站数,L是路程,P是初始燃料量
struct node{
    int a, b; //a是加油站到城镇(终点)的距离,b是每个加油站燃料量
}code[MAX_N];

bool comp(node x, node y){ //自定义排序函数:先按位置升序排,相等时再按油量降序
    if (x.a==y.a)
        return x.b>y.b;
    return x.a<y.a;
}

int main(){
    scanf("%d",&N);
    ;i>=;i--)
        scanf("%d%d",&code[i].a,&code[i].b);
    scanf("%d%d",&L,&P);
    ;i<N;i++)
        code[i].a=L-code[i].a; //为适应挑战上的算法,需要改变 a的含义

    //为了叙述方便,把终点也视为加油站
    code[N].a=L;
    code[N].b=;
    N++;

    //若加油站的位置随意输入,应按距离城镇远近排序
    sort(code,code+N,comp);

    //维护加油站的优先队列
    priority_queue<int> s;

    //ans:加油次数,pos:当前位置,tank:剩余燃料量
    ,pos=,tank=P;

    ;i<N;i++){
        //接下来要前进的距离
        int d=code[i].a-pos;

        //不断加油直到能够行驶到下一个加油站
        ) {
            if(s.empty()) {
                printf("-1\n");
                ;
            }
            tank+=s.top();
            s.pop();
            ans++;
        }
        tank-=d;
        pos=code[i].a;
        s.push(code[i].b);
    }
    printf("%d\n",ans);
    ;
}

在卡车开往终点的途中,只有途径加油站才能加油

稍微变换一下思考方式:到达加油站 i 时,就获得了一次在之后任何时候都可以加 code[i].b 单位燃料的权利,以后加油时,就认为是在之前经过的加油站加油即可

由于希望到达终点时加油次数尽可能少,所以当燃料为0时再进行加油,且选择燃料量最大的加油站

为了高效操作,可使用从大到小依次取出数值的优先队列

  • 经过加油站时,往优先队列里加如 code[i].b
  • 当燃料箱为空时
  1. 若优先队列为空,则无法到达终点
  2. 否则取出最大元素用来给卡车加油

POJ 2431——Expedition(贪心,优先队列)的更多相关文章

  1. POJ 2431 Expedition (贪心+优先队列)

    题目地址:POJ 2431 将路过的加油站的加油量放到一个优先队列里,每次当油量不够时,就一直加队列里油量最大的直到能够到达下一站为止. 代码例如以下: #include <iostream&g ...

  2. poj 2431 Expedition 贪心 优先队列 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=2431 题解 朴素想法就是dfs 经过该点的时候决定是否加油 中间加了一点剪枝 如果加油次数已经比已知最少的加油次数要大或者等于了 那么就剪 ...

  3. poj 2431 Expedition 贪心+优先队列 很好很好的一道题!!!

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10025   Accepted: 2918 Descr ...

  4. POJ 2431 Expedition (优先队列+贪心)

    题目链接 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. ...

  5. POJ 2431 Expedition(优先队列、贪心)

    题目链接: 传送门 Expedition Time Limit: 1000MS     Memory Limit: 65536K 题目描述 驾驶一辆卡车行驶L单位距离.最开始有P单位的汽油.卡车每开1 ...

  6. poj - 2431 Expedition (优先队列)

    http://poj.org/problem?id=2431 你需要驾驶一辆卡车做一次长途旅行,但是卡车每走一单位就会消耗掉一单位的油,如果没有油就走不了,为了修复卡车,卡车需要被开到距离最近的城镇, ...

  7. poj 2431 Expedition 贪心

    简单的说说思路,如果一开始能够去到目的地那么当然不需要加油,否则肯定选择能够够着的油量最大的加油站加油,,不断重复这个贪心的策略即可. #include <iostream> #inclu ...

  8. POJ 2431 Expedition 贪心 优先级队列

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30702   Accepted: 8457 Descr ...

  9. POJ 2431 Expedition(探险)

    POJ 2431 Expedition(探险) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] A group of co ...

  10. POJ 2431 Expedition (贪心 + 优先队列)

    题目链接:http://poj.org/problem?id=2431 题意:一辆卡车要行驶L单位距离,卡车上有P单位的汽油.一共有N个加油站,分别给出加油站距终点距离,及加油站可以加的油量.问卡车能 ...

随机推荐

  1. redis 原理系列之--字符串存储的实现原理(1)

    背景 redis功能强大,几乎已经成了现代大中型服务必备的缓存技术了. 除了十分给力的缓存功能,redis当做消息队列,数据库也有着不错的表现. 我们都知道,redis 有五种数据类型,string, ...

  2. ios5与ios7数字输入样式一致

    <input  name="activeCode" id="activeCode" ontouchstart="this.type='numbe ...

  3. fiddler的安装与使用(二)使用fiddler捕获会话信息

    前章回顾: 上一遍文章我们已经安装好了fiddler,并解了fiddler的工作原理,接下来开始使用fiddler捕获浏览器会话信息. fiddler基本界面: 首先启动fiddler,然后打开浏览器 ...

  4. HDU6223——2017ICPC沈阳G Infinite Fraction Path

    题意: 给定一个数字串,每个位子都能向(i*i+1)%n的位子转移,输出路径上,字典序最大的,长度为n的串. 参考:https://www.cnblogs.com/mountaink/p/954144 ...

  5. poj3984 迷宫问题(简单的输出路径的bfs)

    题目链接 http://poj.org/problem?id=3984 中文题题意不解释了 反正就是简单的结构体套结构体存一下路径就行了 #include <iostream> #incl ...

  6. hud 3555 Bomb 数位dp

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  7. 【Offer】[10-1] 【斐波那契数列】

    题目描述 思路分析 Java代码 代码链接 题目描述  大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). 思路分析 递归的思路,会出现很多重复的 ...

  8. requests + BeautifulSoup + json

    requests: response.text      以 unicode 格式显示响应的文本 response.content    以 二进制 格式显示响应的文本 BeautiSoup: sou ...

  9. CentOS7.6中mysql实践

    cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 使用:yum -y install mysql mysql-server 安装 ...

  10. 【LeetCode】33-搜索旋转排序数组

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这 ...