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 }
要不断学习,吸收借鉴,加油!

浙公网安备 33010602011771号