【最大化最小值】 Aggressive cows

传送门

题意

给定\(n\)个牛舍的坐标\(x_{i}\),给定\(m\)头牛,将牛放到\(n\)个牛舍中,使得最近的两头牛的距离最大

数据范围

\(2 \leq n\leq 100000\)
\(2\leq m\leq n\)
\(0\leq x_{i}\leq 10^{9}\)

题解

  • 二分牛之间的最小距离,每次判断当前距离下能不能安排下所有的牛

  • \(check\)函数中累计距离\(\geq\)当前二分的距离的牛的数量,最后判断如果满足就符合

  • 复杂度\(O(nlogn)\)

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
const int N=1e5+10;
int n,m;
int x[N];

bool check(int v)
{
    int cnt=1;
    int last=x[1];
    rep(i,2,n+1)
    {
        if(x[i]-last>=v) 
        {
            last=x[i];
            cnt++;
        }
        if(cnt==m) return 1;
    }
    return 0;  
}
int main()
{
    scanf("%d%d",&n,&m);
    
    rep(i,1,n+1)
        scanf("%d",&x[i]);

    sort(x+1,x+n+1);
    int l=1,r=1e9;

    while(l<r)
    {
        int mid=l+r+1>>1;
        if(check(mid)) l=mid;
        else r=mid-1; 
    }
    printf("%d\n",l);
}
posted @ 2020-05-26 00:13  Hyx'  阅读(177)  评论(0编辑  收藏  举报