优先队列priority_queue
可以看看https://blog.csdn.net/qq_34494458/article/details/53589878
优先队列默认容器时vector,默认算子时less,小的往前排,大的往后排,输出时从后往前依次输出。即大的优先级高。
empty() 如果队列为空返回真
pop() 删除对顶元素
push() 加入一个元素
size() 返回优先队列中拥有的元素个数
top() 返回优先队列对顶元素
priority_queue<int>;
priority_queue<int,vector<int>,greater<int>>;//小的先出队。
自定义优先级:
#include <bits/stdc++.h> #include <algorithm> #define mod 1000000007 #define LL long long using namespace std; struct node{ int x; friend bool operator<(node a,node b){ return a.x < b.x;//大的优先级高。 //return a.x > b.x //小的优先级高。 } }; int main() { priority_queue<node>q; node q1; for(int i = 5; i >= 0; i--){ q1.x = i; q.push(q1); } while(!q.empty()){ node q2; q2 = q.top(); cout << q2.x << endl; q.pop(); } return 0; }
hdu看病要排队 http://acm.hdu.edu.cn/showproblem.php?pid=187
#include <bits/stdc++.h>
#include <iostream>
const int Max = 1e6+5;
#define LL long long
const int mod = 1e6+7;
//const int inx = INT_MAX;
using namespace std;
/* run this program using the console pauser&nbs***bsp;add your own getch, system("pause")&nbs***bsp;input loop */
// srand(time(NULL));
// m = rand() % 1000 + 1;
//定义i i(A) i+n i+n(B) i+n+n i+n+n(C)
struct node{
int b,k;
friend bool operator < (node a,node c){
if(a.b == c.b) return a.k > c.k;//优先级相同按先来的优先级高。
return a.b < c.b;
}
};
int main()
{
int N,A,B,t1,t2,t3;
char ch[10];
while(cin >> N){
priority_queue<node>q1;
priority_queue<node>q2;
priority_queue<node>q3;
node q;
t1 = t2 = t3 = 0;
while(N--){
cin >> ch;
if(ch[0] == 'I'){
cin >> A >> B;
q.b = B;
t1++;
q.k = t1;
if(A == 1) {
q1.push(q);
}
else if(A == 2){
q2.push(q);
}
else{
q3.push(q);
}
}
else{
cin >> A;
if(A == 1){
if(!q1.empty()){
q = q1.top();
cout << q.k << endl;
q1.pop();
}
else cout << "EMPTY" << endl;
}
else if(A == 2){
if(!q2.empty()){
q = q2.top();
cout << q.k << endl;
q2.pop();
}
else cout << "EMPTY" << endl;
}
else{
if(!q3.empty()){
q = q3.top();
cout << q.k << endl;
q3.pop();
}
else cout << "EMPTY" << endl;
}
}
}
}
return 0;
} 排队:https://ac.nowcoder.com/acm/contest/6488/C
class Solution { public: /** * 求解合法的(i,j)对的数量 * @param n int整型 n个人 * @param m int整型 m个窗口 * @param a int整型vector 长度为n的vector,顺序表示1-n号客人的办理业务所需时间 * @return long长整型 */ long long t_sum[100005],t[100005]; long long ans = 0; void merge(int l,int mid,int r){ int j,m; m = l,j = mid+1; for(int i = l; i <= r; i++){ if(m <= mid && (j > r || t_sum[m] <= t_sum[j])){ t[i] = t_sum[m]; m++; } else{ t[i] = t_sum[j]; j++; ans += mid - m + 1; } } for(int i = l; i <= r; i++){ t_sum[i] = t[i]; } } void sort_merge(int l,int r){ if(r <= l) return; int mid = (l + r) / 2; sort_merge(l,mid); sort_merge(mid+1,r); merge(l,mid,r); } long long getNumValidPairs(int n, int m, vector<int>& a) { // write code here priority_queue<long long,vector<long long>,greater<long long>>q; int t = min(n,m); for(int i = 0; i < t; i++){ t_sum[i] = a[i]; q.push(t_sum[i]); } long long temp; for(int i = m; i < n; i++){ temp = q.top(); t_sum[i] = temp + a[i]; q.pop(); q.push(t_sum[i]); } sort_merge(0,n-1); return ans; } };