其他分享
首页 > 其他分享> > NC204859 组队

NC204859 组队

作者:互联网

NC204859 组队

题目

题目描述

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

输入描述

第一行一个整数 \(T\),表示案例组数。每个案例有两行:第一行两个正整数 \(n,k\) ,表示人的数量。
第二行 \(n\) 个以空格分隔的整数 \(a_i\) ,表示每个人的能力值。

输出描述

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

示例1

输入

1
5 3
8 3 5 1 6

输出

3

说明

选择能力值为 \(3,5,63,5,63,5,6\) 或者 \(5,6,85,6,85,6,8\)

备注

\(T \leq 10\)
\(1 \leq n \leq 2e5, 1 \leq k \leq 1e9\)
\(1 \leq a_i \leq 1e9\)

题解

思路

知识点:枚举,贪心。

注意到任意两人数值差不能大于 \(k\) ,因此考虑先按从小到大排序,枚举左端点和右端点,在符合右端点减左端点数值小于等于 \(k\) 的情况下加人数,其答案具有单调性,即左端点改变右端点不需要回撤,可以用尺取法。

时间复杂度 \(O(Tn \log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int a[200007];

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--) {
        int n, k;
        cin >> n >> k;
        for (int i = 0;i < n;i++) cin >> a[i];
        sort(a, a + n);
        int ans = 0;
        int l = 0, r = 0;
        while (l < n) {
            while (r < n && a[r] - a[l] <= k) r++;
            ans = max(ans, r - l);
            l++;
        }
        cout << ans << '\n';
    }
    return 0;
}

标签:比赛,leq,int,cin,组队,NC204859,while,端点
来源: https://www.cnblogs.com/BlankYang/p/16379491.html