优先队列头文件
#include <queue>
默认优先为从大到小优先。
自定义优先级
1 struct cmpmin{ //按从小到大 2 3 // 因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。 4 bool operator ()(int &a, int &b){ 5 return a>b; //所以规定小的元素的优先级大于大的元素。 6 } 7 }; 8 9 struct cmpmax{ //按从大到小 10 bool operator ()(int &a, int &b){ 11 return a<b; 12 } 13 }; 14 15 16 //多个元素的时候 17 struct node{ 18 int x, y; 19 friend bool operator <(int a, int b){ //小的优先级小,所以按照x从大到小,注意默认是<来确定优先级。 20 return a.x < b.x; 21 } 22 } 23 24 struct node{ 25 int x, y; 26 friend bool operator <(int a, int b){ //小的优先级大,所以按照x从小到大 27 return a.x > b.x; 28 } 29 }
本题要输出第K大的数,因为数据量大,不能每次排序,所以用优先队列来解决。
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 struct cmp{ 7 bool operator ()(int &a,int &b){ 8 return a>b;//最小值优先 9 } 10 }; 11 int n, k, val, cnt; 12 char c; 13 int main(){ 14 while(~scanf("%d%d", &n, &k)){ 15 cnt = 0; 16 priority_queue <int, vector<int>,cmp> q; 17 while(n--){ 18 cin>>c; 19 if(c == 'Q'){ 20 printf("%d ", q.top()); 21 } 22 else if(c == 'I'){ 23 scanf("%d", &val); 24 if(cnt < k){ 25 q.push(val);cnt++; 26 } 27 else{ 28 if(val > q.top()){ 29 q.pop(); 30 q.push(val); 31 } 32 } 33 } 34 } 35 36 } 37 38 39 return 0; 40 }