题目大意:
给出n个块,每个长度为k,给出n个左起点,只要有重叠部分就可以相互跨越,问点数最多的环,并输出点数
思路:
首先将左起点排序,往后面找,判断第i + 1个可不可以加进去前面的阵营
可以形成环的条件:x[i + 1] - x[i - 1] <= k && x[i + 1] - x[i] <= k
代码:
#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <algorithm>
const int maxn = 5555;
int x[maxn];
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n,k;
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i++)
scanf("%d",&x[i]);
sort(x + 1,x + 1 + n);
int i = 1;
int ans = 0;
while(i <= n) {
int pre = i;
int cnt = 1;
while(i < n &&(cnt == 1 || x[i + 1] - x[i - 1] <= k) && x[i + 1] - x[i] <= k) {
i++;
cnt++;
}
if(pre == i)
i++;
ans = max(ans,cnt);
}
printf("%d\n",ans);
}
return 0;
}