• 牛客小白月赛24 B-组队(二分)


    地址: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;
        }    
    }
  • 相关阅读:
    例6-5
    例6-3
    例6-2
    例6-1
    例5-9
    python3
    python3
    python3
    python3
    python3
  • 原文地址:https://www.cnblogs.com/liyexin/p/12741455.html
Copyright © 2020-2023  润新知