五一训练礼包—中位数

中位数

Content

  · 题目回溯

  · 题目分析

  · 可行代码

  · 总结

(一) 题目回溯

  DESCRIPTION

  INPUT

  OUTPUT

  EXAMPLE

  NOTE

(二) 题目分析

  由题可知,数组升序,从数组头开始,每个数与后面的数组成一个新的数组(新数组除了第一个数和必须升序以外别的没有限制),然后在新的数组中找中位数,累加求和。

   为了保证最后的和最大,就必须保证每一个新数组中位数最大。

  所以新的数组可以是数组头后的每一个数字与数组尾的( n - 1 )个数字构成一个新的数组然后取中位数。

   从数组尾开始组队,可以用栈来存储数据。

  取中位数的次数为k次,每次出栈n / 2个后就是新数组的中位数,累加中位数后出栈中位数即可。

(三) 可行代码

#include <iostream>
#include <stack>
using namespace std;
int main() {
    int T;
    cin >> T;
    while (T--) {
        int n, k;
        cin >> n >> k;
        stack<long long> s;
        int nk = n * k, temp;
        while (nk--)
            cin >> temp, s.push(temp);
        long long tempK = k, sum = 0;
        while (tempK--)
        {
            int tempN = n / 2;
            while (tempN--)
                s.pop();
            sum += s.top(), s.pop();
        }
        cout << sum << endl;
    }
    return 0;
}

(四) 总结

   本题主要考察对题干定义的中位数的理解

原文地址:https://www.cnblogs.com/kirk-notes/p/14728697.html