将题中所给的条件|a[i]-K|<=p化简一下可以得到-p=<a[i]-K<=K+P;
即 a[i]>=k-p ,a[i]<=k+p;
k可以取任意值,题干要求找出一个合适的k使得在这个区间内的人数尽可能多。
要想要在这个长度为2p的区间内包含尽可能多地值,那么它的边界一定是数组a的某一个值,接下来只需要找有多少个值在a[i]和a[i]+2p之间即可,
为了方便统计,先将数组a从小到大排序,再对于排序好后的数组遍历,依次统计每一个a[i]作为区间左边界时包含的值,找出其中的最大值即可.
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,p;
cin>>n>>p;
vector<int>a(n);
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a.begin(),a.end());
int m=0;//最大的长度
int cntlen =0;//当前的长度
for(int i=0;i<n;i++){
while(i+cntlen+1<n && a[i+cntlen+1]-a[i]<=2*p){
cntlen++;
}
m = max(cntlen,m);
}
cout<<m+1;
}

京公网安备 11010502036488号