【算法题】流水线

257次阅读
没有评论

共计 1366 个字符,预计需要花费 4 分钟才能阅读完成。

一个工厂有m条流水线,来并行完成n个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。
现给定流水线个数m,需要完成的作业数n, 每个作业的处理时间分别为t1,t2…tn。请你编程计算处理完所有作业的耗时为多少?
当n>m时,首先处理时间短的m个作业进入流水线,其他的等待,当某个作业完成时,依次从剩余作业中取处理时间最短的进入处理。

  • 输入描述:
    第一行为2个整数(采用空格分隔),分别表示流水线个数m和作业数n;
    第二行输入n个整数(采用空格分隔),表示每个作业的处理时长t1,t2…tn。
    (0< m,n<100,0<t1,t2…tn<100)
    注:保证输入都是合法的。
  • 输出描述:
    输出处理完所有作业的总时长

示例1

输入
3 5
8 4 3 2 10
输出
13
说明

  1. 先安排时间为2、3、4的3个作业。
  2. 第一条流水线先完成作业,然后调度剩余时间最短的作业8。
  3. 第二条流水线完成作业,然后调度剩余时间最短的作业10。
  4. 总工耗时就是第二条流水线完成作业的时间13(3+10)。
import java.util.*;
import java.util.stream.Collectors;

/**
 * @since 2022年4月19日
 */
public class AssembleLine {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String m_n = scanner.nextLine();
        String timeStr = scanner.nextLine();

        // 取出m条流水线 n个作业数
        int m = Integer.parseInt(m_n.split(" ")[0]);
        int n = Integer.parseInt(m_n.split(" ")[1]);

        // 所有作业数的时间集合
        List<Integer> ts = Arrays.stream(timeStr.split(" ")).map(Integer::parseInt).sorted(Comparator.comparingInt(o -> o)).collect(Collectors.toList());

        // 由于他们可以同时开工
        // 如果流水线多于任务数,那么就取时间最上的那个任务时间
        if (n <= m) {
            System.out.println(ts.get(n - 1));
        }

        ArrayList<Integer> res = new ArrayList<>();

        for (int i = 0; i < m; i++) {
            res.add(ts.get(i));
        }

        for (int i = m; i < ts.size(); i++) {
            int index = i % m; // 换个方式
//            Integer min = res.stream().sorted().iterator().next(); // 这一快很有意思,无限制取,和平常了解的迭代器不同
//            int index = res.indexOf(min);
            res.set(index, res.get(index) + ts.get(i));
        }

        Integer maxTime = res.stream().max(Integer::compareTo).get();
        System.out.println(maxTime);


    }
}
正文完
 0
裴先生
版权声明:本站原创文章,由 裴先生 2022-04-20发表,共计1366字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
本站勉强运行: