根据题面,我们的目标是最大化这个总和:
- 等同于:
那么问题就变成了:
从  个学生中,选出 
 个作为各组的最大值,
 个作为各组的最小值,使得最大值们的总和与最小值们的总和之差最大。
- 如何让 最大? - 很简单,我们从排好序的数组中,选择最大的 个数 作为这 个组的 。 
 
- 很简单,我们从排好序的数组中,选择最大的 
- 如何让 最小? - 同样,我们选择最小的 个数 作为这 个组的 。 
 
- 同样,我们选择最小的 
最后把就是结果了
附AC代码
#include <bits/stdc++.h>
#define all(arr) arr.begin(), arr.end()
#define endl '\n'
#define int long long
using namespace std;
template <typename T>
istream &operator>>(istream &is, vector<T> &v)
{
    for (auto &x : v)
        is >> x;
    return is;
}
void solve()
{
    int n, k;
    cin >> n >> k;
    vector<int> v(n);
    cin >> v;
    sort(all(v));
    int ans = 0;
    for (int i = n - k; i < n; ++i)
    {
        ans += v[i];
    }
    for (int i = 0; i < k; ++i)
    {
        ans -= v[i];
    }
    cout << ans << endl;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t = 1;
    while (t--)
        solve();
    return 0;
}
简言之,为最大化总管理方便度 ,我们将目标重构为最大化 
。因此,最优策略是选择数组中最大的 
 个数作为 
 组的 
 值,并选择数组中最小的 
 个数作为 
 组的 
 值,答案即为这两组数各自求和后的差值。

 京公网安备 11010502036488号
京公网安备 11010502036488号