地址:https://ac.nowcoder.com/acm/contest/5158/B
解析:先把数组排序,我们需要取某一段,这一段的最大-最小<=k,关键是取哪一段。可以对于每个数,往后找,找到第一个减它>k的,这中间一段就满足了任意两个数之差<=k了。找的过程可以用upper_lound(,,x),它返回第一个大于x的数。当然也可以直接手写二分了。
#include<iostream> #include<vector> #include<algorithm> #include<set> #include<map> #include<cmath> using namespace std; typedef long long ll; const int maxn=2e5+10; ll a[maxn]; int main() { int t; cin>>t; while(t--) { ll n , k; cin>>n>>k; for(int i = 0 ;i < n ; i ++) cin>>a[i]; sort(a,a+n); ll maxx=0; for(int i = 0 ; i < n ; i++) { ll md=upper_bound(a,a+n,a[i]+k)-a; maxx=max(maxx,md-i); } cout<<maxx<<endl; } }
或者直接手写二分了
#include<iostream> #include<vector> #include<algorithm> #include<set> #include<map> #include<cmath> using namespace std; typedef long long ll; const int maxn=2e5+10; ll a[maxn]; int main() { int t; cin>>t; while(t--) { ll n , k; cin>>n>>k; for(int i = 0 ;i < n ; i ++) cin>>a[i]; sort(a,a+n); ll maxx=0; for(int i = 0 ; i < n ; i++) { ll l=i,r=n-1; ll mid; while(l<r) { mid=(l+r)>>1; if(a[mid]-a[i]>k) { r=mid; // 1 3 5 6 8 } else l=mid+1; } maxx=max(maxx,l-i); } cout<<maxx<<endl; } }