中位数
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; }
(四) 总结
本题主要考察对题干定义的中位数的理解