牛客網 NC204859 組隊
目錄
文章目錄
1. 題目描述
1.1. Limit
Time Limit: C/C++ 1秒,其他語言2秒
Memory Limit: C/C++ 262144K,其他語言524288K
1.2. Problem Description
你的團隊中有 個人,每個人有一個能力值 ,現在需要選擇若干個人組成一個團隊去參加比賽,由於比賽的規則限制,一個團隊裏面任意兩個人能力的差值必須要小於等於 ,爲了讓更多的人有參加比賽的機會,你最多能選擇多少個人參加比賽?
1.3. Input
第一行一個整數 ,表示案例組數。每個案例有兩行:第一行兩個正整數 ,表示人的數量。第二行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
選擇能力值爲 或 。
1.8. Source
2. 解讀
使用滑動窗口進行計算。
先對數組從小到大進行排序,如果 區間內的數都滿足 ,則 ,否則 ,每滑動一次計算一次 ,取所有情況的最大值即可。
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
公衆號:複雜網絡與機器學習
歡迎關注/轉載,有問題歡迎通過郵箱交流。