一个工厂有m条流水线
来并行完成n个独立的作业
该工厂设置了一个调度系统
在安排作业时,总是优先执行处理时间最短的作业
现给定流水线个数m
需要完成的作业数n
每个作业的处理时间分别为 t1,t2...tn
请你编程计算处理完所有作业的耗时为多少
当n>m时 首先处理时间短的m个作业进入流水线
其他的等待
当某个作业完成时,
依次从剩余作业中取处理时间最短的
进入处理
输入描述:
第一行为两个整数(采取空格分隔)
分别表示流水线个数m和作业数n
第二行输入n个整数(采取空格分隔)
表示每个作业的处理时长 t1,t2...tn
0<m,n<100
0<t1,t2...tn<100
输出描述
输出处理完所有作业的总时长
案例
输入
3 5
8 4 3 2 10
输出
13
说明
先安排时间为2,3,4的三个作业
第一条流水线先完成作业
调度剩余时间最短的作业8
第二条流水线完成作业
调度剩余时间最短的作业10
总共耗时 就是二条流水线完成作业时间13(3+10)
3 9
1 1 1 2 3 4 6 7 8
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Cmp(const void *a, const void *b)
{
return (*(int *)a - *(int *)b);
}
void PrintList(int *list, int len)
{
int i;
for (i = 0; i < len; i++) {
printf("%d ", list[i]);
}
printf("\n");
}
int GetMax(int *list, int len)
{
int i, max;
max = list[0];
for (i = 0; i < len; i++) {
if (max < list[i]) {
max = list[i];
}
}
return max;
}
int CountTime(int *list, int n, int m)
{
int i;
int currMin = 0;
int *task = malloc(sizeof(int) * m);
memset(task, 0, sizeof(int) * m);
int *currentTask = malloc(sizeof(int) * m);
memset(currentTask, 0, sizeof(int) * m);
/* 排序 */
qsort(list, n, sizeof(int), Cmp);
PrintList(list, n);
/* 分第一次任务 */
for (i = 0; i < m; i++) {
task[i] = list[i];
currentTask[i] = list[i];
}
currMin = task[0];
int taskIdx = m;
while (1) {
for (i = 0; i < m; i++) {
//task[i] += list[i];
currentTask[i]--;
if (currentTask[i] == 0) {
printf("insert task[%d]\n", list[taskIdx]);
currentTask[i] = list[taskIdx];
task[i] += list[taskIdx];
taskIdx++;
}
if (taskIdx >= n) {
// 循环结束
return GetMax(task, m);
}
}
}
}
int main()
{
int n, m, i;
int *list = NULL;
scanf("%d %d", &m, &n);
printf("%d %d\n", m, n);
list = malloc(sizeof(int) * n);
if (list == NULL) {
return -1;
}
memset(list, 0, sizeof(int) * n);
for (i = 0; i < n; i++) {
scanf("%d", &list[i]);
}
printf("max time[%d]\n", CountTime(list, n, m));
return 0;
}