半题外话:优先队列个人认为主要优点是可以在排序后进行类似于插入排序的操作,适合于需要在数组排序后再次进行操作的题目(再由此产生一堆bug)
本蒟蒻是在敲贪心的题时遇见的(弱得连个贪心都不会敲了呵),就开始了学(mo)习(ca)之旅
____________________________
————————————————
优先队列的结构:
队列
1.back() 返回一个引用,指向最后一个元素
2.empty() 如果队列空则返回真
3.front() 返回第一个元素
4.pop() 删除第一个元素
5.push() 在末尾加入一个元素
6.size() 返回队列中元素的个数
优先队列:
1.empty() 如果优先队列为空,则返回真
2.pop() 删除第一个元素
3.push() 加入一个元素
4.size() 返回优先队列中拥有的元素的个数
5.top() 返回优先队列中有最高优先级的元素
关于头文件的问题:以上操作都在头文件#include<queue>中执行。
来份代码操作???
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
int main()
{
priority_queue<int > que; // 默认从大到小
int n;scanf("%d",n);
for(int i=0;i<n;i++){scanf("%d",a[i]);}
for(int i = 0;i < n;i++)
{
que.push(x[i]);
}
for(int i = 0;i < n;i++)
{
printf("%d ",que.top());//将数组x进行从大到小的输出
que.pop();
}
printf("\n");
return 0;
}
排序方式可以有以下的不同写法:
priority_queue<int,vector<int>,greater<int> > que;// 从小到大 注意空格用于区分位运算
priority_queue<int,vector<int>,less<int> > que;// 从大到小
priority_queue<int > que; // 默认从大到小
//如果仅是队列的话只需要
queue<int>que;
如果操作后想进行把数据插入到有序数列的操作,只需加一句话:
#include<queue>
#include<cstdio>
using namespace std;
priority_queue<int>q;
int n,i,a,b,x,ans;
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&x),q.push(x);//把x逐个输入
while(q.size()>1)
{
a=q.top();q.pop();//拎出最前面(即最大)的两个值
b=q.top();q.pop();
ans+=a+b;//叠加操作
q.push(a+b); //把二者的和再次插入队列中
}
return !printf("%d",ans);
}
由于pop的因素,原被操作的a,b两值不会再出现,也不会被再次操作。
以上够使用一段时间了(佛系自我安慰被拎走),以下是其他的优先序列定义方式:
(1)自定义优先级:
struct cmp
{
operator bool ()(int x, int y)
{
return x > y; // x小的优先级高 //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
}
};
priority_queue<int, vector<int>, cmp> q; //定义方法
//其中,第二个参数为容器类型。第三个参数为比较函数。
(2)结构体声明方式:
struct node
{
int x, y;
friend bool operator < (node a, node b) //注意此处的重载
{
return a.x > b.x; //结构体中,x小的优先级高
}
};
priority_queue<node>q; //定义方法
//在该结构中,y为值, x为优先级。
//通过自定义operator<操作符来比较元素中的优先级。
//在重载”<”时,最好不要重载”>”,可能会发生编译错误
————————————萌新一枚,有不足之处还望各位dalao指出ヾ(๑╹◡╹)