1.大跟堆:从小到大,最小的优先级最高定义方法:
priority_queue<int,vector<int>,greater<int> >vis;
注意vis左边> >这两个">"中间有个空格,不能少
2.小跟堆:从大到小,最大的优先级最高
定义方法:
priority_queue<int>vis;
基本跟队列相同,不同的是:
3.队列返回队头元素front(),优先队列返回优先级最高的元素top()
4.结构体定义方式:
struct sa
{
int x,num;
};
bool operator<(const sa&a,const sa&b)
{
if(a.x!=b.x)
return a.x<b.x;//与平常相反,这里输出大到小排列
else return a.num<b.num;
}
priority_queue<sa>vis2;
洛谷 P3378 【模板】堆
#include <bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >vis;//大根堆从小到大
int a[10005];
int main()//
{
int n,x,flag;
while(~scanf("%d",&n))
for(int i=0;i<n;i++)
{
scanf("%d",&flag);
if(flag==1)
{
scanf("%d",&x);
vis.push(x);
}
if(flag==2){
cout<<vis.top()<<endl;}
if(flag==3){
vis.pop();}
}
return 0;
}
买饭-优先队列
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
priority_queue<int>vis;//小根堆从大到小
struct sa
{
int val,num;
}a[1005];
bool cmp(sa b,sa c)
{
if(b.val!=c.val)
return b.val<c.val;
else return b.num<c.num;
}
int main()//
{
int n,x,flag;
long long sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].num=i