CodeForces - 1133E K Balanced Teams(dp)
题目大意
从n个人里面挑几个分成不大于k个组,要求每组中的任意两个数相差不超过5,组与组之间独立,问最多选出多少人。
解题思路
比较经典的dp,排序之后二分出前面不小于当前数-5的数字有多少,然后写n*n的dp就行了。
代码
const int maxn = 5e3+10;
const int maxm = 2e5+10;
int dp[maxn][maxn], arr[maxn], pre[maxn];
int n, k;
int main() {
cin >> n >> k;
for (int i = 1; i<=n; ++i) cin >> arr[i];
sort(arr+1, arr+n+1);
for (int i = 1; i<=n; ++i) {
int p = lower_bound(arr+1, arr+n+1, arr[i]-5)-arr;
pre[i] = i-p+1;
}
//选出k个
for (int i = 1; i<=k; ++i) {
for (int j = i; j<=n; ++j) {
int t = min(pre[j], j-i+1);
dp[j][i] = max(dp[j-1][i], dp[j-t][i-1]+t);
}
}
//选出小于等于k个
// for (int i = 1; i<=k; ++i) {
// for (int j = 1; j<=n; ++j) {
// dp[j][i] = max(dp[j-1][i], dp[j-pre[j]][i-1]+pre[j]);
// }
// }
cout << dp[n][k] << endl;
return 0;
}