【最大化最小值】 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);
}