优先队列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; } };