STL之priority_queue的使用

来源:互联网 发布:淘宝沉香哪家比较好 编辑:程序博客网 时间:2024/05/29 07:54

priority_queue说明:

优先队列的实现就不说了,运用的是堆的知识,前几篇博客已经有提到。现在讲讲如何在比赛的时候直接用STL里面的队列头文件中的priority_queue来帮我们解题。下文有两种使用方法,一种是运用#include<functional>中的greater<type>和less<type>来帮我们实现数据的排序。还有一种是自定义,也就是自己写排序方法让priority_queue来根据我们排序方法来排序。

代码:

#include<iostream>#include<queue>#include<functional>using namespace std;const int maxn = 1001;priority_queue<int,vector<int>,greater<int> > q;priority_queue<int,vector<int>,less<int> > qu;struct cmp   //自定义优先队列的顺序,按priority的编号排列{friend bool operator < (cmp n1,cmp n2){return n1.priority < n2.priority;  //从小到大排列}int priority;int value;};struct cmp1  //自定义优先队列的顺序,按priority的编号排序{friend bool operator < (cmp1 n1,cmp1 n2){return n1.priority > n2.priority;  //从大到小排序}int priority;int value;};int main(){int num,m,num1,num2;/*--functional头文件中自带的排序方式(greater<int>和less<int>)*/cout<<"请输入m个数:"<<endl;cin>>m;for(int i=0;i<m;i++){cin>>num;q.push(num);qu.push(num);}cout<<"from small to large:"<<endl;while(!q.empty()){int p = q.top();cout<<p<<endl;q.pop();}cout<<"from large to small:"<<endl;while(!qu.empty()){int p = qu.top();cout<<p<<endl;qu.pop();}priority_queue<cmp> que;priority_queue<cmp1> que1;cmp a[maxn];cmp1 b[maxn];/*以下为自己编写自定义排列方式*/cout<<"请输入m个数:"<<endl;cin>>m;cout<<"请输入每个数的优先次序编号和它所对应的值:"<<endl;for(int i=0;i<m;i++){cin>>num1>>num2;a[i].priority = num1;  //根据这个编号排列b[i].priority = num1;a[i].value = num2;   //值b[i].value = num2;que.push(a[i]);que1.push(b[i]);}cout<<endl;cout<<"from large to small:"<<endl;while(!que.empty()){cmp p = que.top();cout<<p.value<<endl;que.pop();}cout<<"from small to large:"<<endl;while(!que1.empty()){cmp1 p = que1.top();cout<<p.value<<endl;que1.pop();}return 0;}


运行结果:

functional头文件自带的排序功能运行结果:

自定义优先队列运行结果:

 优先队列实际题目(来自UVA1203 Argus)

你的任务是编写一个称为Argus的系统,该系统支持一个Register命令

Register Q_num Period

该命令注册了一个触发器,它每Period秒钟就会产生一次编号为Q_num的事件。你的任务是模拟出前k个事件。如果多个事件同时发生,先处理Q_num小的事件。

input

       输入仅包含一组数据。前若干行是Register命令,以“#”结尾;最后一行是整数k。对于每条命令,1<=Q_num,Period<=3000。k<=10000。命令条数n不超过1000.

output

       输出k行,即前k个事件的Q_num。

UVA1203代码如下:

#include<iostream>#include<queue>#include<cstdio>using namespace std;struct Item{int QNum,Period,Time;bool operator < (const Item& a) const{return Time > a.Time || (Time == a.Time && QNum > a.QNum);}};int main(){priority_queue<Item> pq;char s[20];while(cin>>s && s[0] != '#'){Item item;cin>>item.QNum>>item.Period;item.Time = item.Period;pq.push(item);}int K;cin>>K;while(K--){Item r = pq.top();pq.pop();cout<<r.QNum<<endl;r.Time += r.Period;pq.push(r);}return 0;}
0 0
原创粉丝点击