题解:CF571B Minimization
模
再贪心地想,要使
设
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e5 + 5;
const int M = 5e3 + 5;
int n, k, a[N], dp[M][M];
signed main() {
ios_base :: sync_with_stdio(NULL);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> k;
for(int i = 1 ; i <= n ; ++ i)
cin >> a[i];
sort(a + 1, a + 1 + n);
int len = n / k, m1 = n % k, m2 = (n - m1) / len - m1;
memset(dp, 0x3f, sizeof dp);
dp[0][0] = 0;
for(int i = 0 ; i <= m1 ; ++ i)
for(int j = 0 ; j <= m2 ; ++ j) {
int now = i * (len + 1) + j * len;
if(i) dp[i][j] = min(dp[i][j], dp[i - 1][j] + a[now] - a[now - len]);
if(j) dp[i][j] = min(dp[i][j], dp[i][j - 1] + a[now] - a[now - len + 1]);
}
cout << dp[m1][m2];
return 0;
}