HDU ACM 4006 The kth great number (优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=4006
题意:题目会给出n个数,求第k大的数.
输入:第一行输入两个整数n 和 k
接下来有n行数据,输入的数据分为两种.
输入I 和 一个数字x 表示写入数字x
输入Q 表示进行一次询问 询问当前第k大的数是多少并输出这个数.
开始使用sort进行排序,提交后会超时.
后来改用优先队列.
声明一个结构体
1 struct Node 2 { 3 int x; 4 friend bool operator < (Node a,Node b) 5 { 6 return a.x > b.x; 7 } 8 9 };
主要用于重载小于号,让小的优先.
输入时先输入k个数,输入k个数后再输入时需要判断输入的数与队头的大小关系.
输入数小于队头则不进队.
输入数大于队头则进队,弹出队头.
保证优先队列中只有k的元素.
而队头是k个元素中最小的元素.
即第k大元素
View Code
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <queue> 5 using namespace std; 6 struct Node 7 { 8 int x; 9 friend bool operator < (Node a,Node b) 10 { 11 return a.x > b.x; 12 } 13 14 }; 15 int main() 16 { 17 int T,k; 18 while(cin>>T>>k) 19 { 20 priority_queue <Node> q; 21 int mark_k = 0; 22 while(T--) 23 { 24 char ch; 25 cin>>ch; 26 if(ch == 'I') 27 { 28 if(mark_k < k) 29 { 30 Node num; 31 mark_k++; 32 cin>>num.x; 33 q.push(num); 34 } 35 else 36 { 37 Node num; 38 cin>>num.x; 39 if(num.x > q.top().x) 40 { 41 q.pop(); 42 q.push(num); 43 } 44 } 45 } 46 else 47 { 48 if(ch == 'Q') 49 { 50 cout<<q.top().x<<endl; 51 } 52 } 53 } 54 } 55 return 0; 56 }