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;
} 
posted @ 2021-02-23 23:12  shuitiangong  阅读(46)  评论(0编辑  收藏  举报