public class Test14 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String[] s = sc.nextLine().split(" ");
int[] arr = new int[s.length-1];
int count = Integer.parseInt(s[s.length - 1]);
for (int i = 0; i < s.length-1; i++) {
arr[i] = Integer.parseInt(s[i]);
}
Arrays.sort(arr);
// 暴力解法
System.out.println(solve(arr,count));
// 二分查找的变体,求最小满足条件的值
System.out.println(solve2(arr,count));
}
}
private static int solve(int[] arr, int count) {
int min = -1;
for (int i = 1; i <= arr[arr.length - 1]; i++) {
int everyCount = 0;
for (int j = 0; j < arr.length; j++) {
everyCount += (arr[j] + i - 1) / i;
//System.out.println("inner: " + i + "--->" + everyCount);
}
//System.out.println("outter: " + i + "--->" + everyCount);
if (everyCount <= count) {
min = i;
break;
}
}
return min;
}
private static int solve2(int[] arr, int count) {
int left = 1, right = arr[arr.length - 1];
while (left < right) {
int mid = left + (right - left) / 2;
if (ok(arr, count, mid)) {//中间速度能够吃得上桃子,那么就降低吃桃子的速度
right = mid;//保留mid,继续向左找更小的可行解
} else {//速度不够,那就增加吃桃子的速度
left = mid + 1;
}
}
// 兼容异常吃不到桃的场景
return ok(arr,count,left)?left:-1;
}
private static boolean ok(int[] arr, int count, int mid) {
int times = 0;
for (int i = 0; i < arr.length; i++) {
times += (arr[i] + mid - 1) / mid;
}
return times <= count;
}
}
华为OD机试 - 猴子吃桃 - 二分查找(Java 2025 B卷 200分)
于 2025-06-07 17:20:13 首次发布