题目:
/*农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这
些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,000,000,均为整数,各不相同).
John的C (2≤C≤N)头牛每头分到一个隔间。牛都希望互相离得远点省得互
相打扰。怎样才能使任意两头牛之间的最小距离尽可能的大,这个最大的
最小距离是多少呢?*/
输入:
5 3
1
2
8
4
9
输出:
3
解题思路:
该题采用二分法,L为0,R为a数组的最大和最小的差,先对数组排序,然后二分查找,然后这个mid 满足距离的条件,保存住mid ,继续往下面寻找L=mid+1,如果不满足,那就r=mid-1;直到找到为止。
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
//zhao1();
//gen();
//zhengshudui();
niu();
}
public static void niu(){
/*农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这
些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,000,000,均为整数,各不相同).
John的C (2≤C≤N)头牛每头分到一个隔间。牛都希望互相离得远点省得互
相打扰。怎样才能使任意两头牛之间的最小距离尽可能的大,这个最大的
最小距离是多少呢?*/
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();//隔间
int m=scanner.nextInt();//放牛
int a[]=new int[n];
for (int i = 0; i < a.length; i++) {
a[i]=scanner.nextInt();
}
Arrays.sort(a);
/* for (int i : a) {
System.out.println(i);
}*/
int num=0;
int l=0;
int mid;
int r=a[n-1]-a[0];
while(l<=r){
mid=l+(r-l)/2;
if(pi(mid, a,m)){
num=mid;
l=mid+1;
}
else{
r=mid-1;
}
}
System.out.println(num);
}
//进行判断操作
public static boolean pi(int n ,int a[],int m){
int num=1;
int p=a[0];
for (int i = 1; i < a.length; i++) {
if(a[i]-p>=n){
num++;
p=a[i];
if(num==m){
return true;
}
}
}
return false;
}
}