流水线调度_100分_A/B复用卷_逻辑分析模拟/排序

流水线调度

题目描述:

  一个工厂有 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)。

解题思路:

本题题目看起来难,其实排序之后问题变得很简单,
m 个机器, n 个时间升序任务,任务分成一轮一轮的执行,则每一轮执行结束后,每个机器执行的总时间总是升序的,故下一轮又重新从0号机器开始分发任务。
所以要求的总时间就是执行任务最长的那台台机器运行时间。
在这里插入图片描述

代码:

public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	String[] split = scanner.nextLine().split(" ");
	int m = Integer.parseInt(split[0]);
	int n = Integer.parseInt(split[1]);
	int[] tasks = new int[n];
	split = scanner.nextLine().split(" ");

	// 输入处理
	for (int i = 0; i < n; i++) {
		tasks[i] = Integer.parseInt(split[i]);
	}

	// 任务排序
	Arrays.sort(tasks);
	int time = 0;
	int[] machines = new int[m];
	// 任务一个一个的处理
	for (int i = 0; i < n; i++) {
		// 任务总是轮流这分发给每台机器
		machines[i % m] += tasks[i];
		time = Math.max(machines[i % m], time);
	}

	System.out.println(time);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值