优先队列(张磊大佬分享的)
看了半天的优先队列没看懂
还是找了下大佬整理的资料看着
代码很简单,所以就不解释了,等找到优先队列的题目再来更新吧
#include<iostream> #include<cstdio> #include<functional> #include<queue> #include<vector> using namespace std; struct cmp1{ bool operator () (int &a,int &b){ return a>b; //最小值优先 } }; struct cmp2{ bool operator () (int &a,int &b){ return a<b; //最大值优先 } }; //定义结构,使用运算符重载,自定义优先级2 struct number1{ int x; bool operator < (const number1 &a) const{ return x<a.x; //最大值优先 } }; struct number2{ int x; bool operator < (const number2 &a) const { return x>a.x; //最小值优先 } }; int main() { priority_queue<int>que; //采用默认优先级构造队列 priority_queue<int,vector<int>,cmp1>que1; //最小值优先 priority_queue<int,vector<int>,cmp2>que2; //最大值优先 priority_queue<int,vector<int>,greater<int> >que3; //最小值优先 priority_queue<int,vector<int>,less<int> >que4; //最大值优先 priority_queue<num1>que5; priority_queue<num2>que6; que1.empty(); //判断一个队列是否为空 que1.pop(); //删除队顶元素 que1.push(); //加入一个元素压入栈顶 que1.size(); //返回优先队列中拥有的元素个数 que1.top(); //返回优先队列的队顶元素(不删除) //时间复杂度为O(logn) n为队列中元素的个数 }
push(x) 将x压入队列的末端
pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值
front() 返回第一个元素(队顶元素)
back() 返回最后被压入的元素(队尾元素)
empty() 当队列为空时,返回true
size() 返回队列的长度
补题了 :
在紫书上找到一到优先队列的题 p120 UVA136
//丑数是指不能被2,3,5以外的其它素数整除的数,把丑数从小到达排列起来,结果如下: // 1,2,3,4,5,6,8,9,10,12…… // 求第1500个丑数? #include<iostream> #include<vector> #include<queue> #include<set> using namespace std; typedef long long ll; const int coeff[3]={2,3,5}; int main() { priority_queue<ll,vector<ll>,greater<ll> >gg;//优先队列定义 set<ll>s; gg.push(1); s.insert(1); for(int i=1; ;i++) { ll x=gg.top(); gg.pop(); if(i==1500) { cout<<"The 1500'th ugly number is "<<x<<".\n"; break; } for(int j=0;j<3;j++) { ll x2=x*coeff[j]; if(!s.count(x2)){ s.insert(x2); gg.push(x2); } } } return 0; }