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 }

 

posted @ 2012-09-02 19:44  zx雄  阅读(1018)  评论(0编辑  收藏  举报