poj 2833 优先队列的应用

题目有提示内存限制,所以自然会想到用优先队列来维护前k大和前k小。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 using namespace std;
 6 
 7 typedef long long ll;
 8 priority_queue<int, vector<int>, greater<int> > s;
 9 priority_queue<int, vector<int>, less<int> > b;
10 
11 int main ()
12 {
13     int n1, n2, n;
14     while ( scanf("%d%d%d", &n1, &n2, &n) != EOF )
15     {
16         if ( !n1 && !n2 && !n ) break;
17         ll ans = 0;
18         for ( int i = 0; i < n; i++ )
19         {
20             int tmp;
21             scanf("%d", &tmp);
22             ans += tmp;
23             if ( s.size() < n1 )
24             {
25                 s.push(tmp);
26             }
27             else
28             {
29                 if ( tmp > s.top() )
30                 {
31                     s.pop();
32                     s.push(tmp);
33                 }
34             }
35             if ( b.size() < n2 )
36             {
37                 b.push(tmp);
38             }
39             else
40             {
41                 if ( tmp < b.top() )
42                 {
43                     b.pop();
44                     b.push(tmp);
45                 }
46             }
47         }
48         while ( !s.empty() )
49         {
50             ans -= s.top();
51             s.pop();
52         }
53         while ( !b.empty() )
54         {
55             ans -= b.top();
56             b.pop();
57         }
58         double avg = ans * 1.0 / ( n - n1 - n2 );
59         printf("%.6f\n", avg);
60     }
61     return 0;
62 }

 

posted @ 2015-08-19 10:50  hxy_has_been_used  阅读(259)  评论(0编辑  收藏  举报