牛客小白月赛24 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;
    }    
}

猜你喜欢

转载自www.cnblogs.com/liyexin/p/12741455.html