luogu P1316 丢瓶盖 |二分答案

题目描述

陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?

输入格式

第一行,两个整数,A,B。(B<=A<=100000)

第二行,A个整数,分别为这A个瓶盖坐标。

输出格式

仅一个整数,为所求答案。


一道练习二分的经典例题

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll f[100001];ll a,b;
bool check(ll x)
{
    ll ans=0,last=-(1<<30);
    for(int i=1;i<=a;i++)
    {
        if(f[i]-last>=x)
        {
        //  cout<<i<<" ";
            last=f[i];
            ans++;
            if(ans>=b)return 1;
        }
    }
    return 0;
}
int main()
{
    cin>>a>>b;
    ll ansmax=0;
    for(int i=1;i<=a;i++)
    {
        scanf("%lld",&f[i]);
        ansmax=max(ansmax,f[i]);
    }

    sort(f+1,f+a+1);
    ll l=0,r=ansmax+1;
    ll ans=0;
    while(l<=r)
    {
        ll mid=(l+r)/2;
        if(check(mid))
        {
            l=mid+1;
            ans=max(ans,mid);
        }
        else 
        r=mid-1;
    }
    cout<<ans;
}

猜你喜欢

转载自www.cnblogs.com/naruto-mzx/p/11846810.html