import java.io.*;
import java.util.Arrays;
/**
* 食堂供餐
* 为将员工取餐排队时间降低为0,食堂的供餐速度必须要足够快。现在需要根据以往员工取餐的统计信息,
* 计算出一个刚好能达成排队时间为0的最低供餐速度。即,食堂在每个单位时间内必须至少做出多少份盒饭才能满足要求
* 输入描述
* 第一行为一个正整数N,表示食堂开餐时长。1 <= N <= 1000
* 第二行为一个正整数M,表示开餐前食堂已经准备好的盒饭份数。 Pi <= M <= 1000
* 第三行为N个正整数,用空格分隔,一次表示开餐时间内按时间顺序每个单位时间进入食堂取餐的人数Pi
* 1 <= i <= N,0 <= Pi <= 100
* 输出一个整数,能满足题目要求的最低供餐速度(每个单位时间需要做出多少份盒饭)
* 补充说明:
* 每人只取一份盒饭
* 需要满足排队时间为0,必须保证取餐员工到达食堂时,食堂库存盒饭数量不少于本次来取餐的人数
* 第一个单位时间来取餐的员工只能取开餐前食堂准备好的盒饭。
* 每个单位时间里制作的盒饭只能供应给后续单位时间来的取餐的员工食堂在每个单位时间里制作的盒饭数量是相同的
*/
public class CanteenServeFood {
/*
3
14
10 4 5
--------------
3
*/
private static String line;
private static int length;
private static String[] strArr;
private static int preparedMeals;
private static int[] incomingPeople = new int[1000];
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
line = in.readLine();
length = Integer.parseInt(line);
line = in.readLine();
preparedMeals = Integer.parseInt(line);
line = in.readLine();
strArr = line.split(" ");
for (int i = 0; i < length; i++) {
incomingPeople[i] = Integer.parseInt(strArr[i]);
}
out.println(getMinimumSpeed());
in.close();
out.close();
}
/**
* 通过二分查找得到最小的制作速度
* @return 最小的制作速度
*/
public static int getMinimumSpeed() {
int result = 0;
int low = 0;
//速度上限是单位时间进入食堂取餐的人数最大值
int high = Arrays.stream(incomingPeople).max().orElse(0);
//二分循环
while (low <= high) {
int mid = low + (high - low) / 2;
if (canServeAll(mid)) {
result = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
return result;
}
/**
* 计算给定的制作速度是否能满足员工取餐的需求
* @param addedMeals 每个单位时间需要做出多少份盒饭
* @return 给定的制作速度是否能满足员工取餐的需求
*/
private static boolean canServeAll(int addedMeals) {
//剩余盒饭初始化
int remainingMeals = preparedMeals;
//遍历单位时间进入食堂的人数数组
for (int people : incomingPeople) {
// 算上员工取走的盒饭
remainingMeals -= people;
// 如果剩余的盒饭不足以满足当前时间的员工,则返回false
if (remainingMeals < 0) {
return false;
}
// 每个单位时间加上新制作的盒饭
remainingMeals += addedMeals;
}
return true;
}
}
【二分法】食堂供餐
最新推荐文章于 2024-10-11 17:30:36 发布