跟谁学笔试题-最短执行时间

思路:

  • 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。

原文地址:https://www.cnblogs.com/luo-c/p/13938771.html