题意:
农夫约翰搭了一间有N间牛舍的小屋。牛舍排在一条线上,第 i 号牛牛舍在 xi 的位置。但是他的M头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其它牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离。
分析:
该题答案是在一个区间之内,并且有单调性,而且对于每一个答案,验证起来都很方便。
满足了二分答案的两个特性:
①答案在确定的区间之内,答案具有单调性
②每个答案都可验证
代码:
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
int n,c,dis[100010],ans;
int main()
{
while(~scanf("%d%d",&n,&c))
{
ans = 0;
rep(i,1,n)
scanf("%d",&dis[i]);
sort(dis+1,dis+1+n);
int r = dis[n]-dis[1],l = 1;
while(l <= r)
{
int mid = (l+r)>>1;
int tmp = 1;
int jud = 1;
rep(i,2,c){
jud = 1;
rep(j,tmp+1,n){
if(dis[j]-dis[tmp]>=mid)
{
tmp = j;
jud = 0;
break;
}
}
if(jud == 1) break;
}
if(jud) r = mid-1;
else l = mid+1;
}
printf("%d\n",r);
}
return 0;
}