优先队列行为像队列,但先出队列的元素不是先进队列的元素,而是队列中优先级最高的元素。
重载运算符:
for example:重载"()"
struct cmp
{
bool operator() (const int a,const int b) const{
return a%10>b%10;
}
};
int main()
{
priority_queue<int,vector<int>,cmp> pq;
}
STL提供的定义方法:
priority_queue<ll,vector<ll>,greater<ll> > pq; //越小的数优先级越高
注意:最后两个“>”不能写在一起,否则会被很多编译器误认为“>>”运算符。
STL的queue头文件提供了优先队列,用push()和pop()进行元素的入队和出队操作,top()取队首元素(但是不删除)。
例题:
丑数是指不能被2,3,5以外的其他素数整除的数,把丑数从小到大排列起来,结果如下:1,2,3,4,5,6,8,9,10,12,15,…
求第n个丑数。
代码如下:
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<set>
#define ll long long
using namespace std;
const int a[3]= {2,3,5};
int main()
{
priority_queue<ll,vector<ll>,greater<ll> > pq;
set<ll> s;
int n;
cin>>n;
pq.push(1);
s.insert(1);
for(int i=1;; i++)
{
ll x=pq.top(); //取出队首元素
pq.pop(); //弹出优先级最高的元素
if(i==n)
{
cout<<"The ugly number is "<<x<<".\n";
break;
}
for(int j=0; j<3; j++)
{
ll x2=x*a[j];
if(!s.count(x2)) //查重
{
s.insert(x2);
pq.push(x2);
}
}
}
return 0;
}