给定

整数分组(冬季每日一题 16)_双指针

个整数

整数分组(冬季每日一题 16)_i++_02


现在,请你从中挑选一些数,并将选出的数进行分组。

要求:

  1. 选出的数最多划分为
  2. 整数分组(冬季每日一题 16)_双指针_03

  3. 组(至少
  4. 整数分组(冬季每日一题 16)_ios_04

  5. 同一组内,任意两数之差的绝对值不超过
  6. 整数分组(冬季每日一题 16)_DP_05

  7. 所选出的数尽可能多。

请问,最多可以选出多少个数进行分组?

输入格式

第一行包含两个整数

整数分组(冬季每日一题 16)_双指针


整数分组(冬季每日一题 16)_i++_07


第二行包含

整数分组(冬季每日一题 16)_双指针

个整数

整数分组(冬季每日一题 16)_i++_02


输出格式
输出一个整数,表示可以选出的最大整数数量。

数据范围

整数分组(冬季每日一题 16)_#include_10


整数分组(冬季每日一题 16)_ios_11


输入样例1:

5 2
1 2 15 15 15

输出样例1:

5

输入样例2:

6 1
36 4 1 25 9 16

输出样例2:

2

输入样例3:

4 4
1 10 100 1000

输出样例3:

4


整数分组(冬季每日一题 16)_i++_12

表示在前

整数分组(冬季每日一题 16)_DP_13

个数中选,将其分为

整数分组(冬季每日一题 16)_双指针_14

组的方案

整数分组(冬季每日一题 16)_DP_15


整数分组(冬季每日一题 16)_DP_16

表示不选当前第

整数分组(冬季每日一题 16)_DP_13

个数,分为

整数分组(冬季每日一题 16)_双指针_14

组的方案

整数分组(冬季每日一题 16)_DP_19

表示选当前第

整数分组(冬季每日一题 16)_DP_13

个数,最右边的组的左边界取到第

整数分组(冬季每日一题 16)_i++_07

个数的方案

整数分组(冬季每日一题 16)_i++_07

满足

整数分组(冬季每日一题 16)_i++_23

#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;
}