目录
小孩子不懂事写着玩的
一.优先队列原型
priority_queue<Type, Container, Functional>
第一个参数为所要存储的数据类型,第二个是容器类型,默认为vector,但不能是list,第三个为自定义比较方法
二.问题引入
在做杭电oj1837是遇见使用pair和优先队列的问题
三.解决方法
原理:自定义类来重载“( )”运算符
class cmp{
public bool operator()(参数){ "()"是被重载的运算符
比较方法
}
}
AC代码:
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#define ll long long
using namespace std;
typedef pair<int,int> pa;
class cmp{
public:
bool operator()(const pa &o1,const pa &o2)const{
//.top()是取的最大优先级,而优先级大的在后面,所以要反向排序
//top取的就是顶,参考栈顶
if(o1.first==o2.first) return o1.second>o2.second;
return o1.first<o2.first;
}
};
int main() {
pair<int, int> p;//first 为病人优先级,second为病人序号
ll n,id;
string s;
while(scanf("%lld",&n)!=EOF){
int a=0;
priority_queue<pa,vector<pa>,cmp>A,B,C;// 数据类型,容器,比较方 法
while (n--) {
cin >> s;
if (s == "IN") {
cin >> id >> p.first;
a++;//病人序号
if (id == 1) {
p.second = a;
A.push(p);
}
else if (id == 2) {
p.second = a;
B.push(p);
}
else {
p.second = a;
C.push(p);
}
}
else {
cin >> id;
if (id == 1) {
if (A.empty()) {
cout << "EMPTY" << endl;
continue;
}
cout << A.top().second << endl;
A.pop();
}
else if (id == 2) {
if (B.empty()) {
cout << "EMPTY" << endl;
continue;
}
cout << B.top().second << endl;
B.pop();
}
else{
if (C.empty()) {
cout << "EMPTY" << endl;
continue;
}
cout << C.top().second << endl;
C.pop();
}
}
}
}
return 0;
}
四.注意:
优先级越大的在queue中排的越往后,因为取的是top