你的团队中有 个人,每个人有一个能力值
,现在需要选择若干个人组成一个团队去参加比赛,由于比赛的规则限制,一个团队里面任意两个人能力的差值必须要小于等于
,为了让更多的人有参加比赛的机会,你最多能选择多少个人参加比赛?
你的团队中有 个人,每个人有一个能力值
,现在需要选择若干个人组成一个团队去参加比赛,由于比赛的规则限制,一个团队里面任意两个人能力的差值必须要小于等于
,为了让更多的人有参加比赛的机会,你最多能选择多少个人参加比赛?
第一行一个整数
,表示案例组数。
每个案例有两行:
第一行两个正整数
,表示人的数量。
第二行n个以空格分隔的整数,表示每个人的能力值。
每个案例输出一行,表示可以参加比赛的最多人数。
1 5 3 8 3 5 1 6
3
选择能力值为或者
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int a;
}power;
int compare (const void*a, const void*b);
//快排+窗口滑动
int main() {
int T;
scanf("%d", &T);
while (T-- > 0){
int n, k;
scanf("%d %d",&n,&k);
power* A =(power*)malloc(sizeof(power)* n);
for(int i = 0;i < n;i++){
scanf("%d",&A[i].a);
}
qsort(A, n, sizeof(power), compare);
int left = 0;
int len = 0;
for (int right = 0;right < n;right++){
while (A[right].a - A[left].a >k){
left++;
}
int idx = right - left + 1;
if (idx > len){
len = idx;
}
}//找出最长子序列区间
printf("%d\n", len);
free(A);
}
return 0;
}
int compare (const void*a, const void*b){
power* x = (power*)a;
power* y = (power*)b;
return x->a - y->a;
}