总时间限制: 1000毫秒 内存限制: 65536kB
描述
农夫约翰建造了一个新的长谷仓,其中有N个(2 <= N <= 100,000)摊位。档位沿直线位于位置x1,…,xN(0 <= xi <= 1,000,000,000)。
他的C(2 <= C <= N)头母牛不喜欢这种谷仓布局,一旦放到摊子里就会变得互相攻击。为了防止母牛互相伤害,FJ希望将母牛分配给摊位,以使它们之间的最小距离尽可能大。最大最小距离是多少?
输入
*第1行:两个以空格分隔的整数:N和C
*第2…N + 1行:第i + 1行包含整数停滞位置xi
输出
*第1行:一个整数:最大最小距离
样例输入
5 3
1个
2
8
4
9
样例输出
3
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int a[100010];
int can(int k,int n,int c);
int main()
{
int n,c;
scanf("%d%d",&n,&c);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int mm=1,nn=1e9/c,mid,result;
while(mm<=nn){
mid=(mm+nn)/2;
if(can(mid,n,c)){
result=mid;
mm=mid+1;
}else{
nn=mid-1;
}
}
printf("%d",result);
return 0;
}
int can(int k,int n,int c){
int x1=a[0];
int c2=1;
x1+=k;
for(int i=1;i<n;i++){
if(a[i]>=x1){
c2++;
x1=a[i]+k;//这里容易出错 不能直接写x1+=k!!!!!!!!!!!!!!!!!;
}
if(c2==c){
return 1;
}
}
return 0;
}```