The Average
    输入:几个测试用例组成。 每个测试用例由两行组成。 第一行包含三个整数 n_1, _n_2 and _n (1 ≤ n_1, _n_2 ≤ 10, _n_1 + _n_2 < _n ≤ 5,000,000) ,每两个数之间由一个空格分隔。 第二行包含 n 个正整数 ai (1 ≤ ai ≤ 108 i (1 ≤ in) )由单个空格分隔。 最后一个测试用例后跟三个零。
    输出:对于每个测试用例,在单独的一行中输出四舍五入到小数点后六位的平均值。

    思路:优先队列

    1. #include <iostream>
    2. #include <cstdio>
    3. #include <algorithm>
    4. #include <queue>
    5. using namespace std;
    6. const int N = 5000010;
    7. int n, up, down;
    8. int main() {
    9. while (scanf("%d%d%d", &up, &down, &n), n) {
    10. double s = 0;
    11. priority_queue<int> r;
    12. priority_queue<int, vector<int>, greater<int>> l;
    13. int x;
    14. for (int i = 0; i < n; i++) {
    15. scanf("%d", &x);
    16. s += x;
    17. // 小小的优化
    18. if (r.size() < down) {
    19. r.push(x);
    20. } else if (x < r.top()) {
    21. r.pop();
    22. r.push(x);
    23. }
    24. if (l.size() < up) {
    25. l.push(x);
    26. } else if (x > l.top()) {
    27. l.pop();
    28. l.push(x);
    29. }
    30. }
    31. while (!l.empty()) {
    32. x = l.top();
    33. l.pop();
    34. s -= x;
    35. }
    36. while (!r.empty()) {
    37. x = r.top();
    38. r.pop();
    39. s -= x;
    40. }
    41. printf("%.6lf\n", s / (n - up - down));
    42. }
    43. return 0;
    44. }