链接: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. SpringCloud之Feign

    [前面的话]书接上文,本文的某些知识依赖我的第一篇SpringCLoud的文章:SpringCloud之Eureka,如果没有看过可以先移步去看一下.另外在微服务架构中,业务都会被拆分成一个个独立的服 ...

  2. 步入vue.js世界

    一.遇见vue.js 1.1 Vue.js是什么? Vue.js 是一套用于构建用户界面的渐进式框架,Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合.Vue.js通过简单的 ...

  3. 2019DX#3

    Solved Pro.ID Title Ratio(Accepted / Submitted)   1001 Azshara's deep sea 凸包 6.67%(6/90)  

  4. HDU2222Keywords Search AC_自动机

    http://blog.csdn.net/niushuai666/article/details/7002823 #include <iostream> #include <cstd ...

  5. ZOJ-1610 Count the Colors ( 线段树 )

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Description Painting some co ...

  6. JPA案例

    ORM 什么是ORM: 对象关系映射(Object Relational Mapping,简称ORM)是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的. ORM思想 主要 ...

  7. odoo12之应用:一、双因子验证(Two-factor authentication, 2FA)(HOTP,TOTP)附源码

    前言 双因子认证:双因子认证(2FA)是指结合密码以及实物(信用卡.SMS手机.令牌或指纹等生物标志)两种条件对用户进行认证的方法.--百度百科 跟我一样"老"的网瘾少年想必一定见 ...

  8. 洛谷 P1101单词方阵

    我已经,是这个世界上,最幸福的女孩了                                                                         ——<末日时 ...

  9. Slickflow.NET 开源工作流引擎快速入门之三: 简单或分支流程代码编写示例

    前言:对于急切想了解引擎功能的开发人员,在下载版本后,就想尝试编写代码,完成一个流程的开发和测试.本文试图从请假流程,或分支模式来快速了解引擎代码的编写. 1. 创建或分支流程图形 或分支流程是常见的 ...

  10. Java中 a+=b 和 a=a+b 有什么区别?

    今天舍友突然问我"在java中 a+=b 和a=a+b 有什么区别",说这是一道面试题.当时就不假思索的回答:"一样啊",然后他说有位面试者也回答说一样,所以被 ...