中级篇——优先队列
来源:互联网 发布:汉语方言地图集数据库 编辑:程序博客网 时间:2024/06/13 15:29
优先队列与一般队列不同,插入新元素时不是直接将新元素插入到队尾,而是根据优先级插入到其所在优先级的相应位置。
优先队列分为两种:最大优先队列和最小优先队列。故每次取出的是队列中最大优先级和最小优先级。可以根据默认的优先级排序也可自定义优先级排序。
所需头文件:“queue.h”和“functional.h”。
一、优先队列支持的操作
q.size(); //返回队列元素个数q.empty(); //队列是否为空,空返回true,否则返回falseq.pop(); //删除队首元素,不返回其值q.push(x); //将元素x按优先级插入队列q.top(); //返回队首元素但不删除
二、常见的几种优先队列用法
(1)按默认优先级
priority_queue<int>que;
定义一个名为que的int型优先队列,按照系统默认的优先级进行排序。
(2)自定义升序优先级
定义方法有两种:1.采用结构体定义。2.采用functional头文件内定义。
//采用结构体定义升序struct cmp1{ bool operator()(int &a,int &b) return a>b; //最小值优先的排列 };//采用functional内定义struct num1{ bool operator < (const num&a) const { return x>a.x; //最小值优先的排列 }};推荐使用结构体定义,简单易懂!
(3)定义降序优先级
同样有结构体定义和functional内定义。
//采用结构体定义降序struct cmp2{ bool operator()(int &a,int &b) { return a>b; //最大值优先的排列 }};//采用functional内定义struct num2 { int x; bool operator <(const num2 &a)const { return x<a.x; //最大值优先的排列 }}优先级构造完成,接下来就是构造队列并采用所定义的优先级排列
将数组a[]插入队列中//结构体定义for(int i=0;a[i];i++){ que1.push(a[i]); que2.push(a[i]);}//内定义插入for(int i=0;num1[i].x;i++) que3.push(num1[i].x);for(int i=0;num2[i].x;i++) que4.push(num2[i].x);分别输出que1,2cout<<"输出que1:";while(!que1.empty()){ cout<<que1.top()<<" "; que1.pop();}cout<<endl;cout<<"输出que2:";while(!que2.empty()){ cout<<que2.top()<<" "; que2.pop;}cout<<endl;cout<<"输出que3:";while(!que3.empty()){ cout<<que3.top()<<" "; que3.pop();}cout<<endl;cout<<"输出que4:";while(!que4.empty()){ cout<<que4.top<<" "; que4.pop();}cout<<endl;
典例:http://poj.org/problem?id=3190
题意:
奶牛要在指定的时间挤奶,一台机器只能给一头奶牛挤奶,问最少要几台机器。
思路:用STL里的优先队列,判断空闲机器是否满足下一头奶牛的挤奶时间,满足就让挤完奶的奶牛出队把机器编号给下一头奶牛,下一头奶牛入队,否则机器+1,下一头奶牛入队.
注意:输出的顺序和输入的顺序相同,在输入的时候把下标一起存入结构体,另外开一个数组记录机器的编号,在排序后下标就不会乱了。
AC代码:
#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <math.h>#include <queue>using namespace std;struct pa{ int s,e,x;//开始时间,结束时间,牛的序号 //队列按照结束时间降序排列 bool operator <(const pa&c) const { if(e==c.e) return s>c.s;//结束时间相同,按开始时间降序排列 else return e>c.e; }}a[50005];priority_queue<pa> que;//在pa结构体的基础上建立队列queint cmp1(const pa&a,const pa&b){ if(a.s==b.s) return a.e<b.e; else return a.s<b.s;}int b[50005]; //数组b记录第i头牛在第几条生产线上int main(){ int n; while(cin>>n) { for(int i=0;i<n;i++) { cin>>a[i].s>>a[i].e; a[i].x=i; } sort(a,a+n,cmp1); que.push(a[0]); b[a[0].x]=1; int cnt=1; for(int i=1;i<n;i++) { int t=que.top().e; if(a[i].s>t) { b[a[i].x]=b[que.top().x]; que.pop(); } else { cnt++; b[a[i].x]=cnt; } que.push(a[i]); } cout<<cnt<<endl; for(int i=0;i<n;i++) cout<<b[i]<<endl; } return 0;}
0 0
- 中级篇——优先队列
- 【数据结构——优先队列】优先队列的各种运用
- 优先队列——代码
- Sequence——优先队列
- 优先队列——HDU1873
- 优先队列——左式堆
- stl——优先队列
- 水题——优先队列
- 【数据结构】—— 优先队列
- stl——优先队列
- 优先队列——priority_queue
- 堆——优先队列
- 容器适配器—优先队列
- poj1101——The Game//优先队列
- 优先队列——二叉堆实现
- 优先队列——priority queue
- 优先队列——左式堆的实现
- 优先队列——合并果子
- kafka集群笔记
- OC-027.手动内存管理中的自动释放池@autorelease
- discuz接入七牛sdk
- Arduino 平台与C语言程序设计-week4-Arduino Programs-Lesson3
- Retrofit — 实现Basic Authentication(2)
- 中级篇——优先队列
- oracle数据导入导出
- POJ2456 二分
- storm集群部署
- VMware中Ubuntu为什么挂载不上U盘的解决方法
- Qt对话框中show和exec的区别
- Spring文件上传的问题
- 文章标题
- oracle net manager建立远程连接