最小的和最大次大组队,次小的和第三大第四大组队。。。

这样保证队伍水平值取到最大。

1 2 3 4 5 6 7 8 9 1 8 9 2 6 7 3 4 5

水平值分别为 8 6 4,也就是我们倒着取数就好了。

用 vector 替代动态数组更好一点。 注意,必须用 long long 作为sum的类型,不然有些数据太大了,通不过样例。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    // 最大的数可以带上次大的,第三大带上第四大的
    int n = 0;
    while(cin >> n){
        vector<int> arr;
        arr.resize(3*n);
        for(int i = 0; i < 3*n; ++i)
            cin >> arr[i];
        sort(arr.begin(), arr.end()); // 排升序
        long long sum = 0; // 1 2 3 5 5 5 7 8 9 
        for(int i = 3*n-2; i >= n; i-=2)
            sum += arr[i];
        cout << sum << endl;
    }
    return 0;
}