【算法题】流水线

  • A+
所属分类:编程茶楼


共计 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
说明

先安排时间为2、3、4的3个作业。
第一条流水线先完成作业,然后调度剩余时间最短的作业8。
第二条流水线完成作业,然后调度剩余时间最短的作业10。
总工耗时就是第二条流水线完成作业的时间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);


    }
}
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: