void solve(){
int n,k;cin>>n>>k;
vector<int> a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
sort(a.begin()+1,a.end());
int r=1;
int ans=1;
for(int i=1;i<=n;i++){
while(r<=n&&a[r]-a[i]<=k)r++;
ans=max(ans,r-i);
}
cout<<ans<<endl;
}
枚举每个数最为选择的最小数x,那么小于等于x+k的数都可以和他一起组队,那么我们可以二分的找到第一个大于x+k的数,即可计算出此时的最大值,比较每个数作为起点时产生的最大值即可知道最终答案,
另外我们发现,将数组排序后, 下标 i 产生的最大值一定小于 小标 i+1产生的最大值,那么我们知道 i 对应的最大值下标 r 后,i+1的最大下标一定在r的右侧,这样维护一个r即可做到在排序后O(n)的遍历 时间复杂度O(nlog(n)+n) O(nlog(n))

京公网安备 11010502036488号