首页 > 试题广场 >

组队

[编程题]组队
  • 热度指数:1598 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

你的团队中有  个人,每个人有一个能力值 ,现在需要选择若干个人组成一个团队去参加比赛,由于比赛的规则限制,一个团队里面任意两个人能力的差值必须要小于等于  ,为了让更多的人有参加比赛的机会,你最多能选择多少个人参加比赛?


输入描述:

第一行一个整数 ,表示案例组数。

每个案例有两行:

第一行两个正整数  ,表示人的数量。

第二行n个以空格分隔的整数  ,表示每个人的能力值。



输出描述:

每个案例输出一行,表示可以参加比赛的最多人数。

示例1

输入

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

发表于 2025-11-05 17:12:41 回复(0)