牛客網 NC204859 組隊 滑動窗口

牛客網 NC204859 組隊

目錄

1. 題目描述

1.1. Limit

Time Limit: C/C++ 1秒,其他語言2秒

Memory Limit: C/C++ 262144K,其他語言524288K

1.2. Problem Description

你的團隊中有 nn 個人,每個人有一個能力值 aia_i,現在需要選擇若干個人組成一個團隊去參加比賽,由於比賽的規則限制,一個團隊裏面任意兩個人能力的差值必須要小於等於 kk,爲了讓更多的人有參加比賽的機會,你最多能選擇多少個人參加比賽?

1.3. Input

第一行一個整數 TT,表示案例組數。每個案例有兩行:第一行兩個正整數 n,kn,k,表示人的數量。第二行n個以空格分隔的整數a_i,表示每個人的能力值。

1.4. Output

每個案例輸出一行,表示可以參加比賽的最多人數。

1.5. Sample Input

1
5 3
8 3 5 1 6

1.6. Sample Output

3

1.7. Note

選擇能力值爲 3,5,63, 5, 65,6,85, 6, 8

T10T \leq 10

1n2e51 \leq n \leq 2e5

1k1e91 \leq k \leq 1e9

1<=ai<=1e91 <= a_i <= 1e9

1.8. Source

牛客網 NC204859 組隊

2. 解讀

使用滑動窗口進行計算。

先對數組從小到大進行排序,如果 [left,right][left, right] 區間內的數都滿足 list[right]list[left]<=klist[right] - list[left] <= k,則 right=right+1right = right + 1,否則 left=left+1left = left + 1,每滑動一次計算一次 ans=rightleftans = right - left,取所有情況的最大值即可。

3. 代碼

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

const int num = 2e5 + 1;
long long list[num];

int main(){
    long long t, n, k, ans, buffer, left, right;
    scanf("%lld", &t);
    for(int j = 0; j < t; j++){
        // 初始化
        memset(list, 0, sizeof(list));
        ans = 0;
        left = 0;
        right = 1;
        // 輸入
        scanf("%lld %lld", &n, &k);
        for(long long i = 0; i < n; i++){
            scanf("%lld", &list[i]);
        }
        // 排序
        sort(list, list + n);
        // 計算
        while(right < n){
            // 當右端點爲n時結束循環
            if(list[right] - list[left] <= k){
                // 如果滿足條件,最大值和最小值差值小於等於k
                // 右端點右移
                right++;
            }else{
                // 不滿足條件,左端點右移
                left++;
            }
            ans = max(ans, right - left);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

聯繫郵箱:[email protected]

CSDN:https://me.csdn.net/qq_41729780

知乎:https://zhuanlan.zhihu.com/c_1225417532351741952

公衆號:複雜網絡與機器學習

歡迎關注/轉載,有問題歡迎通過郵箱交流。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章