思路:
• M台服务器,每一次执行完后,都从剩余的任务中,选择需要执行时间最长的;
• 而在 M台 服务器中,每一次将其中最先执行完的任务,执行掉,保证至少能空出一台服务器;
• 每一台服务器都减去这个时间,最终结果累加这个时间。不断的重复即可。
import java.util.Arrays; import java.util.Scanner; public class genShuiXue { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int M = cin.nextInt(); int N = cin.nextInt(); int[] nums = new int[N]; for(int i = 0; i < N; i++) nums[i] = cin.nextInt(); //处理输入数据 Arrays.sort(nums); //输入数组升序排序 int idx = N - 1; //取值的下标 int count = 0; //累计时间 int[] tmp = new int[M]; // M台服务器的辅助数组 while(idx >= 0){ for(int i = 0; i < M; i++){ if(tmp[i] == 0){ //时间片执行完后,就往服务器中加入任务 if(idx < 0) break; tmp[i] = nums[idx--]; //加入的任务,是从剩余任务中,时间最长的加入 } } Arrays.sort(tmp); // 对服务器数组排序 int consume = tmp[0]; //将服务器中,最先执行完的任务取出 count += consume; //将这个时间加入到累计时间中 for(int i = 0; i < M; i++){ tmp[i] -= consume; //服务器中,每一台服务器都执行掉这个时间长度,一定会有一台空出来 } } Arrays.sort(tmp); //所有任务都载入完服务器中了 count += tmp[M-1]; // 取服务器中最大的时间,保证所有的任务都能执行完 System.out.println(count); } }
结果:提交 OJ,显示 AC。