给定 n 个整数 a1, a2, …, an 和⼀个 d,你需要选出若⼲个整数,使得将这些整数从⼩到⼤排好序之 后,任意两个相邻的数之差都不⼩于给定的 d,问最多能选多少个数出来。
【输⼊格式】 第⼀⾏两个整数 n,d (1<=n<=105, 0<=d<=109),分别表⽰整数个数和相邻整数差的下界。 第⼆⾏ n 个整数 a1, a2, …, an (1<=ai<=10^9, 1<=i<=n),表⽰给定的 n 个整数。
【输出格式】 仅⼀⾏⼀个整数,表⽰答案。
【样例输⼊】
6 2
1 4 2 8 5 7
【样例输出】
3
【解释】 注意,选出的数在排序后,相邻两数之差不⼩于给定值。 ⽐如,对于给定值 2,[1 4 7] 是⼀个满⾜条件的选择⽅案,但是[1 4 5] 却不是,因为 5 - 4 = 1 < 2。 在本样例中,[1 4 7],[1 4 8],[1 5 7],[1 5 8],[2 4 7],[2 4 8] 都是满⾜要求的选择⽅案,但是⽆论 如何都没有办法得到⼀个选出 4 个数且满⾜条件的⽅案,所以本样例的答案为 3。
【时空限制】 2500ms,256MB
这道题目,我只过了部分测试点,原因是超时了。我没有做到具体问题具体分析,滥用了动态规划,时间复杂度没有符合要求。下面我先给出自己考场上的代码,给大家做个反面教材,之后给出正确的代码。
考场代码(不能AC):
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int dp[100010];
int max(int a, int b) {
return a > b ? a : b; }
int main() {
int n, d, ret =0;
scanf("%d%d"