现有 (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);
}