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;
}