整数分组(冬季每日一题 16)
原创
©著作权归作者所有:来自51CTO博客作者sweetheart7_7的原创作品,请联系作者获取转载授权,否则将追究法律责任
给定
个整数
。
现在,请你从中挑选一些数,并将选出的数进行分组。
要求:
- 选出的数最多划分为
- 组(至少
- 同一组内,任意两数之差的绝对值不超过
- 。
- 所选出的数尽可能多。
请问,最多可以选出多少个数进行分组?
输入格式
第一行包含两个整数
和
。
第二行包含
个整数
。
输出格式
输出一个整数,表示可以选出的最大整数数量。
数据范围
输入样例1:
输出样例1:
输入样例2:
输出样例2:
输入样例3:
输出样例3:
表示在前
个数中选,将其分为
组的方案
表示不选当前第
个数,分为
组的方案
表示选当前第
个数,最右边的组的左边界取到第
个数的方案
满足
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 5010;
int n, m;
int w[N], f[N][N];
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &w[i]);
sort(w + 1, w + n + 1);
for(int i = 1, k = 1; i <= n; i++){
while(w[i] - w[k] > 5) k++;
for(int j = 1; j <= m; j++)
f[i][j] = max(f[i-1][j], f[k-1][j-1] + (i - k + 1));
}
printf("%d\n", f[n][m]);
return 0;
}