优先队列简单介绍+例题POJ2431

优先队列、图等总结及习题.docx 立即下载

优先队列

一、优先队列简单介绍

  • 优先队列是一种数据结构,能够实现插入一个数值,并且取出最小值(最大值)并删除等操作。
  • 能够使用某种二叉树来实现优先队列,这种二叉树叫“堆”。堆分为小根堆和大根堆,小根堆的意思就是所有的子节点值一定不比父亲的值小,大根堆就是所有的子节点值一定不比父亲的节点值大。并且向堆中插入和取最小的值(或最大)的值得复杂度都为O(logn)。

二、STL中的优先队列

都要加头文件 #include<queue>,具体参考https://www.cnblogs.com/flyoung2008/articles/2136485.html

  • 默认大根堆,priority_queue<int > q;。
  • 小根堆,priority_queue<int, vector<int>, greater<int> > q;
  • 自定义数据结构:priority_queue<Node> q;,要重写operator<,

bool operator<(Node a, Node b){
    if(a.x == b.x) return a.y > b.y;
    return a.x > b.x;   //大于则小根堆,小于则大根堆
}

三、例题 POJ2431 Expedition

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

题意:

驾驶卡车行驶L单位距离,卡车初始P单位汽油,行驶1单位距离消耗1单位汽油。图中有一些加油站,可以在加油站中给汽车加油,知道加油站离终点的距离也知道每个加油站最多给汽车加多少油,现在要求最少停车几次,能够使得汽车到达终点。若不能到达,输出-1。

思路:

  • 题目中加油站数量N非常大,所以不能暴力。然后可以这样想,路过加油站的时候,先不加油,但是你没油的时候你要知道你之前是可以加油的。也就是到达加油站的时候,就获得了加油的权利。这样,当汽车没油的时候,认为在之前加过油就行了。
  • 那么为了使得加油次数最少,每次没油的时候就选取经过的加油站中能够加油最多的一个加油站加油即可。那么就用到了优先队列,大根堆。路过时push(),加油时pop()。

AC代码

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

    const int maxn = 10010; 
    struct Node{
        int x;
        int y;
    }stop[maxn];

    bool cmp (Node a, Node b)           //按照距离从大到小排序 
    {
        return a.x > b.x;   
    }

    int main()
    {
        int n, l, p, cnt = 0;;

        scanf("%d",&n);
        priority_queue<int > q;
        for(int i = 0; i < n ;i ++){
            scanf("%d%d", &stop[i].x, &stop[i].y);
        }
        scanf("%d%d", &l, &p);

        sort(stop, stop + n, cmp);

        int i = 0;
        p ++;               //防止初始位置就有加油站 
        l ++;
        while(p != 0 && l != 0){
            p --;
            l --;
            //cout<<"p="<<p<<" l="<<l<<endl;

            if(l == 0)      //到达终点 
                break;

            if(i < n && stop[i].x == l){    //路过加油站 
                q.push(stop[i++].y);
            }

            if(p == 0 && q.size() != 0){    //没油了 并且还可以加油 
                p += q.top();
                q.pop();
                cnt ++;                     //停车次数加1 
            }
        }

        if(l == 0){
            printf("%d\n",cnt);
        } else {
            printf("-1\n");
        }

        return 0;   
    } 
宇树G1双足机器人SLAM开发环境搭建实战指南 SLAM(同步定位与建图)是机器人自主导航的核心技术。在双足人形机器人平台上,由于运动模型复杂、机身晃动带来高频IMU噪声,SLAM开发对环境配置和依赖管理提出了更高要求。以宇树G1为例,系统阐述如何通过Ubuntu 20.04、ROS Noetic与Docker容器化方案构建可复现的SLAM开发环境。先介绍依赖分层管理与版本锁定原理,再深入catkin工作空间编译、传感器驱动集成、网络与多机通信配置等工程实践,最后提供常见问题排查与避坑指南。这套方法论不仅适用于G1,也可迁移至其他双足或轮式机器人平台,帮 阅读详情

相关推荐

SNN系列|编码篇(2)时序编码

Tempotral Coding 选择编码方法是要根据编码对象以及模型如何处理编码信息进行选择,如下是一种时序信息的编码对比: Threshold-based encoding 又称为tempotral contrast,该方法可以用于编解码一段序列,当差值超过阈值时发放脉冲,阈值是根据编码的序列自适应变化的。 使用该编码方法时,实值序列最好是沿时间变化的,因为在根据差分决定是否发放脉冲后,脉冲的顺序与差分顺序有关。 Time-to-first spike coding 该编码方法将信息用神经元首次

Tianlong Lee的博客 1万+

LeetCode练习九:树(下)——优先队列、堆排序

为了代码的简洁,我们建堆时,将下标为0的位置空出来不用,根节点从1开始。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素,你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。将数组转化为大顶堆,重复从大顶堆中取出数值最大的节点,并让剩余的堆结构继续维持大顶堆性质。:把移走了最大值元素以后的剩余元素组成的序列再构造为一个新的堆积(前面讲的新key下沉)。我们可以使用优先队列(大顶堆)来存储长度为k的窗口内的数组,这样堆顶元素一定是滑动窗口内的最大值。我们只能看到滑动窗口内的。

qq_56591814的博客 1038

Arduino+L298N电机驱动模块避坑指南:从接线到PWM调速的5个常见错误

本文详细解析了使用Arduino与L298N电机驱动模块时,从电源配置、跳线帽使用到PWM调速的5个常见错误与避坑指南。重点阐述了如何正确分离逻辑与电机电源、拔掉ENA/ENB跳线帽以实现PWM调速、理解H桥接线逻辑以控制直流电机正反转,并提供优化代码与散热建议,帮助开发者稳定驱动电机。

rust6ferris的博客 561

【leetcode】优先队列题目集合

一、在N个元素中选出前M个元素(N远大于M时) 在1,000,000个元素中选出前100名。 思路一:对N的元素进行排序,然后选出前M个元素,时间复杂度为O(NlogN)(采用快排或归并排序等高级排序算法) 思路二:使用优先队列,可以将时间复杂度降低为O(NlogM)。具体实现:使用优先队列维护M个元素,即每次向优先队列中加入一个元素时,需要将当前队列中的最小元素替换出去,保证队列中的M个元素...

littlemichelle 3621

gitlab远程子仓库配置SSH - 保姆级教程

在网上搜索了一些方法,但是不够详细,走了好多弯路,所以记录下配置SSH的详细过程吧。

是菠萝的博客 1万+

以高通camera 申请ion内存看dma-buf

1 fd 与ion buffer, file绑定 简单总结就是申请一个buffer,再创建一个dmabuf 结构体然后将,然后将dmabuf中得指针指向buffer,dmabuf 再传递给一个匿名的inode,获取到一个file,这样file和dmabuf绑定起来,也就和buffer关联上。然后再从进程中分配一个空闲的fd,将fd 和file囊绑定。这样就能通过fd 快速查找到buffer。file 是个全系统的,他和进程无关,但是fd 是每个进程都是自己独立的,所以再跨进程传输时只需要保证fd ...

兔兔里个花兔的博客 6443

优先队列(含详细解释和例题)

优先队列是一种特殊的队列,队列中元素都有一定的优先级,元素的出队顺序是根据它们的优先级来确定的。头文件为#include中,优先队列包含队列的所有操作,只是在队列的基础上加上一个排序,优先级高的先出队。定义优先队列:priority_queue1.Type:存储在优先队列中的元素类型。2.Container:用于底层存储的容器类型。STL中默认使用的是vector,但你也可以使用任何提供随机访问迭代器和支持front()以及。

2301_79899522的博客 1226

别再迷信Intel网卡了!用普通笔记本+TWINCAT3搭建EtherCAT主站的完整避坑实录

本文详细介绍了如何用普通笔记本和TWINCAT3搭建EtherCAT主站的完整避坑指南。通过破除必须使用Intel网卡的迷思,提供软件环境搭建、关键配置步骤、Wireshark抓包技巧及性能优化建议,帮助开发者低成本实现EtherCAT主站功能。

weixin_29305337的博客 702

3道经典的优先队列题

优先队列是一种十分强大的数据结构,它保持了一种动态的有序性,对于不断改变有入队的操作,而又需要某种最大或最小的操作的问题是再合适不过了,通常优先队列的实现是由最小堆或者最大堆完成的,并通过堆排序保持队列的有序性,模拟队列的结构,在实际比赛中要写一个堆排序还是要一定的时间的,但是stl中queue容器中已经可以实现优先队列,下面以三道基本的题目来演示priority_queue的作用。 聪明的

South__wind的专栏 3686

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7487

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

Robot_PLC_HMI_Automation 5686

优先队列用法以及例题学习

优先队列的另外一种名字叫堆,堆又分为小根堆,大根堆。 小根堆:根为最小值,左右儿子都比根大,所以出队顺序为升序。 大根堆:根为最大值,左右儿子都比根小,所以出队顺序为降序。 在C++ 头文件<queue>中有priority_queue<类型>表示优选队列数据结构 容器类. eg:priority_queue<类型>默认为大根堆 常用操作: push();//入队 top();//队首 与普通queue<>区别 queue 使用 front() po

qq_46256603的博客 501

FPGA+CUYSB3014实现USB3.0功能

CYUSB3014是赛普拉斯在近几年推出的新一代USB3.0的外设控制器,可以解决USB2.0带宽限制,或者单独开发USB协议和驱动的难题。赛普拉斯将CYUSB3014简称为EZ-USB FX3,具有高度的灵活特性,开发人员只需要下载FX3的固件库,就能使用USB3.0的功能。目前在一些电子产品中,使用主控器加PHY芯片最流行的方式是用FPGA+FX3这种搭配来实现USB3.0接口。......

D_Katter的博客 7065

优先队列的学习记录--例题:Expedition(POJ2431)

优先队列的学习记录--例题:Expedition--POJ2431 首先,什么是优先队列呢? 能够完成下列操作的数据结构叫做优先队列 □ 插入一个数值 □ 取出最小的数值(获得数值,并且删除) 当然,堆也能够实现以上操作,但STL里的priority_queue已经帮我们实现堆了,我们可以直接拿来使用。以下是一些操作的简单实用 priority_queuepque //优先队列的声明 pque.push(x) //优先队列的插入 插入一个整型的变量x pque.top() //读取

qq_45735298的博客 276

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Poj—2431 Expedition 优先队列使用经典例题

就像《挑战程序设计竞赛》所说的——在到达加油站之前时,就获得一次在之后加油的权利。简单的说就是,当你经过第 i 个加油站时,先别加油,先压入优先队列,当你到达第 k 个加油站时,计算你车里的油够不够,若不够则从优先队列中选取一个在前面几站中最大的加油站,若还不够,加第二大的加油站..... 总的来说,先考虑能不能到下一站,能,则不加油;不能,就加前面几站中最大的。 这道题目: 1.给你加油站的距离是

NotColdHeike的博客 579

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

优先队列:POJ2431:Expedition

POJ2431:Expedition C++优先队列基本操作示例: #include<iostream> #include<queue> using namespace std; int main() { //声明 priority_queue<int> my; //插入元素 my.push(1); my.push(2)...

qq_45863710的博客 205

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

POJ2431Expedition 优先队列

解题思路 在到达加油站 i 时,就获得了一次在之后的任何时候都可以加Bi 单位汽油的权利。每次从优先队列中取出最大的汽油。 · 在经过加油站 i 时,向优先队列中加入Bi · 当燃料箱空时,如果优先队列也是空的,则无法到达终点。否则取出优先队列中最大的元素,给卡车加油 import java.util.Comparator; import java.util.PriorityQueue; impo...

weixin_43588422的博客 232

POJ 2431

很久没有刷过题了,找点水题找找手感。 问题链接:POJ 2431 问题简述: 一辆卡车需要经过L单位到达目的地,每单位路程耗1单位的油,共有P单位的油,途中有N个加油站,给出每个加油站距离终点的距离和储备油量,请你求出到达目的地时,最少的加油次数。若无法到达目的地,则输出-1; 问题分析: 一道简单的贪心题。以贪心的思路去思考的话,若需要最少的加油次数,则每次需要加油的时候,只在存有最大加油量的油...

weixin_43983015的博客 499

POJ 2431-Expedition

POJ 2431-Expedition 题意: 开车前往一个距离为l的城市,途中有n个加油站,每行驶一个单位的距离就会消耗一个单位的汽油,每到一个加油站都可以加油,问是否能到达目的地,能到达的话,最少需要加多少次油。 思路: 衷心提醒大家仔细看题!!!!!! 输入的距离不是距起点的距离,而是距终点的距离(白WA3发血亏),而且不一定按顺序给出,需要进行排序,所以用结构体还是比较方便的。 我们可以这样想,既然路过的每个加油站都可以加油,意思就是“经过一个加油站就获得了在之后任何一个时间加油的权力”。 为了最小

zzqwtc的博客 1799

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

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

scf0920 1078

[POJ2431]Expedition[贪心][优先队列]

题目链接:[POJ2431]Expedition[贪心][优先队列] 题意分析:汽车油箱无上限,由于被牛儿们捅破了个口子,每移动1单位距离损失1单位油。初始有p单位油,中间有n个加油站,每个加油站可加油shop[i].amount,距离终点L的距离为shop[i].dis。汽车从初始位置开始出发,问:汽车能否到达终点?如果能,输出最少加油次数。否则,输出-1。 解题思路:既然要加油次数最少,那

闲停 628

挑战程序设计竞赛 (优先队列) POJ 2431 & 3253

POJ 2431 Expedition 点击这里 查看题目 真的自闭,一个晚上写一道题。就是不知道哪里WA了,最后发现题目没有说一定是顺序输入的加油站(stop),所以在具体实现的时候需要先sort一下。/微笑 出错点 The first integer is the distance from the town to the stop; 2至N+1行给出的第一个数值是距终点(town)的...

ysugarr 269

POJ 2431——Expedition(优先队列)

链接:http://poj.org/problem?id=2431 题解 #include<iostream> #include<algorithm> #include<queue> using namespace std; const int MAX_N=1e4+50; int N,L,P; //N是加油站数,L是路程,...

SmallProgramer3121的博客 213

【POJ 2431 --- Expedition】

【POJ 2431 --- Expedition】 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to run over a rock a...

来日浅谈的博客 680

POJ 2431 Expedition

POJ 2431 Expedition 坑:未必是按顺序给出输入,要自己先排序!(样例给的是排好序的,但实际上测试数据是乱序的,如果不排序无法确定遇见加油站的先后顺序) 排序时需要借助struct,因为如果只对dis[i]进行排序,无法保持dis与num之间的对应关系。 [关于struct排序中队sort的使用(https://blog.youkuaiyun.com/qq_40828914/article/d...

CarpeDiem 236

poj2431 -- Expedition

题目地址: http://poj.org/problem?id=2431 题目大意: 给n个城镇,分别是坐标和能加的油的数量,最后给车的位置l,和当前油的数量,每走一个单位,油会漏1点,问最后到达0至少需要加多少油,如果不能到达输出-1。 解题思路: 使用优先队列,利用反向思维,只要能到达的地方,就把当前城镇的油push到优先队列里面,然后只要队列不空,就不断的加队头的油,直到油的量大于等于距离l...

qq_43227036的博客 166
上一篇: hhuoj1054_撸猫狂魔
下一篇: CCF认证 行车路线
WaveBridge
博客等级 码龄10年 8粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值