zoukankan      html  css  js  c++  java
  • [CF1133E] K Balanced Teams

    现有 (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);
    }
    
    
  • 相关阅读:
    TCP的初始cwnd和ssthresh
    C/C++ main
    PHP Function
    run bin
    PHP
    LAMP
    PHP MATH
    PHP array sort
    inline
    gcc g++
  • 原文地址:https://www.cnblogs.com/mollnn/p/12637839.html
Copyright © 2011-2022 走看看