题目链接:
题目大意:
第一行 输入 n k,后有 n 行,对于每一行有两种状态 ,①“I x” : 插入 x ② “Q” : 输出当前 第 K大的数
解题思路:
利用优先队列保证插入新数据后的队列是有序的。
重点:保证 k 个数的队列就行。加一个标志 flag_k;
I: 如果 flag_k<k,则将新输入的数放入队列中。
否则判断第k个数是否小于新输入的数,如果小于,则队头出队,新输入的入队:保证队列中第k个数一直是最大的。
Q: 输出队头即可。
AC Code:
1 #include2 using namespace std; 3 struct Node 4 { 5 int key; 6 friend bool operator < (Node a,Node b) 7 { 8 return a.key>b.key; 9 }10 };11 int main()12 {13 int n,k;14 while(scanf("%d%d",&n,&k)!=EOF)15 {16 priority_queue q;17 int flag_k=0;18 while(n--)19 {20 char c;21 cin>>c;22 if(c=='I')23 {24 Node tem;25 scanf("%d",&tem.key);26 if(flag_k q.top().key)34 {35 q.pop();36 q.push(tem);37 }38 }39 }40 else if(c=='Q')41 printf("%d\n",q.top().key);42 }43 }44 return 0;45 }