计蒜客 T1878 丢瓶盖

最小值最大,显然二分了。

check()函数判断当前相邻点距离为(mid)的情况下能选处多少个点,若选出的点的数量大于等于(m)则满足要求,可继续扩大左边界。

注意点

左边界取为(o),因为存在所有数均相等的情况,此时的答案为(0)

const int N=1e5+10;
int a[N];
int n,m;

bool check(int mid)
{
    int cnt=1,l=a[0];
    for(int i=1;i<n;i++)
        if(a[i] - l >= mid)
            l=a[i],cnt++;
    return cnt>=m;
}

int main()
{
    cin>>n>>m;

    for(int i=0;i<n;i++) cin>>a[i];

    sort(a,a+n);

    int l=0,r=a[n-1]-a[0];
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(check(mid))
            l=mid;
        else
            r=mid-1;
    }
    cout<<l<<endl;
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14669230.html