7.问题描述
有N根竹子,第i根长为Li,现需要m根等长竹子。你可以对n根竹子进行任意分割(不能拼接),计算出这m根竹子最长的长度多少?
输入描述:
第一行包括两个整数N,M,含义如题所述(1 <= N,M <= 100000)
第二行包含N个整数,分别对应N根竹子的长度(0 < l[i] < 10^9)
输出描述:
一个数字,表示分割后最长的长度,保留两位小数
示例1
输入:
3 4
3 5 4
输出:
2.50
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int k;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
k = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
Arrays.sort(arr);
op(arr, 0, arr[n - 1]);
sc.close();
}
private static void op(int[] arr, double left, double right) {
double mid = 0;
while (true) {
if ((mid + "").length() >= 10) {
if (mid < arr[0]) {
System.out.println((double) arr[0] + "0");
break;
} else {
int num = (int) (mid * 100);
double res = num / 100.0;
System.out.println(res);
break;
}
}
mid = (left + right) / 2.0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
int count = (int) (arr[i] / mid);
sum += count;
}
if (sum < k) {
right = mid;
} else if (sum > k) {
left = mid;
} else {
int num = (int) (mid * 100);
double res = num / 100.0;
if ((res + "").length() == 3) {
System.out.println(res + "0");
} else {
System.out.println(res);
}
break;
}
}
}
}