说明
输入数据两行,
第一行输入数据3表示开发时间要求,
第二行输入数据表示需求工作量大小,
输出数据一行,表示部门人力需求。
当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。
当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。
因此6是部门最小的人力需求。
代码
package odjava;
import java.util.Arrays;
import java.util.Scanner;
public class 十_部门人力分配 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = Integer.parseInt(sc.nextLine());
int[] requirements = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
System.out.println(getResult(m, requirements));
}
public static long getResult(int m, int[] requirements) {
Arrays.sort(requirements);
int n = requirements.length;
long min = requirements[n - 1];
long max = requirements[n - 2] + requirements[n - 1];
long ans = max;
while (min <= max) {
long mid = (min + max) >> 1;
if (check(mid, m, requirements)) {
ans = mid;
max = mid - 1;
} else {
min = mid + 1;
}
}
return ans;
}
public static boolean check(long limit, int m, int[] requirements) {
int l = 0;
int r = requirements.length - 1;
int need = 0;
while (l <= r) {
if (requirements[l] + requirements[r] <= limit) {
l++;
}
r--;
need++;
}
return m >= need;
}
}