题目如下
小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。
小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是 K 的两名用户匹配在一起。如果两人分差小于或大于 K,系统都不会将他们匹配。
现在小明知道这个网站总共有 N 名用户,以及他们的积分分别是 A1, A2, AN
小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于 K)?
输入描述
第一行包含两个个整数 N,K。
第二行包含 NN个整数 A1, A2,AN
其中, ,0≤Ai≤10^5
0≤K≤10^5 。
输出描述
输出一个整数,代表答案。
输入输出样例
示例
输入
10 0
1 4 2 8 5 7 1 4 2 8
输出
6
题目解析
先分情况进行算,
首先k=0的时候,我们只需要找到所有的不在同一时间点上线的就可以了。
K!=0的时候,我们就需要进行分析:
假设 i 时间的一个用户上线,它所带来的影响时使得 i+k 和 i-k 的用户无法上线,但是不会影响i+2k和i-2k的用户,然后需要求最大的共同在线人数。我们可以立马想到动态规划方法。
动态规划的动态转移方程该怎么写呐?
当第i个人上线的时候,i-k是一定不会上线,同时不会影响i-2k,所以人数为i的人数加上(i-2k)的人数
当第i个人不上线的时候,i-k是会上线的,得出来的人数即为i-k的人数,
我们状态转移方程即为max(dp[i]+dp[i-2*y], dp[i-y])
但是当i<2k的时候,也只能影响到i-k,所以状态转移方程max(dp[i], dp[i-y])
代码如下
dp = [0 for _ in range(100000