题目描述:
部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求,需求用
requirements[i] 表示,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月的人力是固定的。
目前要求每个月最多有 2 个需求开发,并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少?
输入描述
输入第一行为 M ,第二行为 requirements ,长度为N。
M 表示需要开发时间要求,requirements 表示每个需求工作量大小
1 ≤ N / 2 ≤ M ≤ N ≤ 10000,1 ≤ requirements[i]≤ 10^9
输出描述
对于每一组测试数据,输出部门需要人力需求,行末无多余的空格。
示例1:
输入
3
3 5 3 4
输出
6
说明
当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。
当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。
因此6是部门最小的人力需求。
代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
in.nextLine();
List<Integer> requirements=new ArrayList<>();
String[] str = in.nextLine().split(" ");
for (int i = 0; i < str.length; i++) {
int t=Integer.parseInt(str[i]);
requirements.add(t);
}
Collections.sort(requirements);
Integer firstKey = requirements.get(0);
Integer lastKey = requirements.get(requirements.size()-1);
int beg=firstKey;
int end=lastKey*2;
int time=0;
System.out.println(f(m,requirements,6));
while (true){
int cent=(beg+end)/2;
int t=f(m,requirements,cent);
if(t<=m){
int temp=f(m,requirements,cent-1);
if(temp>m){
time=cent;
break;
}else{
end=cent;
}
}else{
beg=cent;
}
}
System.out.println(time);
}
private static int f(int m, List<Integer> requirements, int index) {
List<Integer> rs=new ArrayList<>(requirements);
int time=0;
int dex=index;
for (int i = 0; i < rs.size(); ) {
int t=rs.get(i);
if(t<dex){
int temp=0;
int k=i;
for (int j = k; j < rs.size() ; j++) {
temp+=rs.get(j);
if(temp>dex){
break;
}
i++;
}
time++;
} else if (t==dex) {
time++;
i++;
}else{
if(t%dex==0){
time+=t/dex;
}else{
time+=t/dex+1;
}
i++;
}
}
return time;
}
}