Running Median

关于堆的应用,题目来源是

poj3784 Running Median(对顶堆)

我的思路:一开始我的思路是每输入一个数到奇数时就sort排一下,但是太复杂。

题解思路:看了许多人的思路,这是一个动态维护中位数的题,我们可以建立两个堆,大根堆和小根堆来实现,小根堆要保证必大根堆大1,这样小根对的顶是中位数。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int c[20];
 4 int main()
 5 {
 6     int n;
 7     cin >> n;
 8     int m = 0;
 9     while (n--)
10     {
11         int nol, sum;
12         cin >> nol >> sum;
13         cout << nol << " " << sum / 2 + 1 << endl;
14         priority_queue<int, vector<int>, less<int>> a;
15         int size_a = 0;
16         priority_queue<int, vector<int>, greater<int>> b;
17         int size_b = 0;
18         int i;
19         int mid = -1e9;
20         for (i = 1; i <= sum; i++)
21         {
22             int w;
23             cin >> w;
24             if (w > mid)
25             {
26                 b.push(w);
27                 size_b++;
28             }
29             else
30             {
31                 a.push(w);
32                 size_a++;
33             }
34             if (i % 2 == 1)
35             {
36                 while (size_b + 1 != size_a)
37                 {
38                     if (size_b + 1 < size_a)
39                     {
40                         b.push(a.top());
41                         a.pop();
42                         size_a--;
43                         size_b++;
44                     }
45                     else
46                     {
47                         a.push(b.top());
48                         b.pop();
49                         size_a++;
50                         size_b--;
51                     }
52                 }
53                 mid = a.top();
54                 m++;
55                 c[m] = mid;
56                 if (m == 10)
57                 {
58                     for (int j = 1; j < 10; j++)
59                         cout << c[j] << " ";
60                     cout << c[10] << endl;
61                     m = 0;
62                 }
63             }
64         }
65         if (m > 0)
66         {
67             for (int j = 1; j < m; j++)
68                 cout << c[j] << " ";
69             cout << c[m] << endl;
70             m = 0;
71         }
72     }
73     return 0;
74 }

要不断学习,吸收借鉴,加油!

posted @ 2021-01-18 23:18  IChase  阅读(84)  评论(0)    收藏  举报
Live2D