首页 > 其他 > 详细

[CF1133E] K Balanced Teams - dp

时间:2020-04-05 17:19:20      阅读:75      评论:0      收藏:0      [点我收藏+]

现有 \(n\) 个人,每个人都有各自的能力值,要你把他们分成 \(k\) 组(每组人数不限),使得每组中任意两个人的能力值之差不超过 \(5\),问你最多可以把多少人分到组中。

Solution

\(f[i][j]\) 表示将前 \(i\) 个人分成 \(j\) 段,且第 \(i\) 个人一定被使用时的最大总人数

\[f[i][j]=\max(f[i-1][j],f[l][j-1]+i-l) \]

其中 \(l=lower\_bound(a[i]-5)-1\)

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 5005;

int n,k,a[N],b[N],f[N][N];

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++) b[i]=lower_bound(a+1,a+n+1,a[i]-5)-a-1;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=min(i,k);j++) {
            int l=b[i];
            f[i][j]=max(f[i-1][j],f[l][j-1]+i-l);
        }
    }
    cout<<*max_element(f[n]+1,f[n]+k+1);
}

[CF1133E] K Balanced Teams - dp

原文:https://www.cnblogs.com/mollnn/p/12637839.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!