一、 问题描述
二、算法思想
首先,将作业按照所需时间从大到小排序。
创建一个长度为m的数组task_time,用来记录每台机器已经加工的作业时间。
从第一个作业开始,依次将作业分配给空闲的机器,并更新task_time数组。
对于每个作业,选择task_time数组中时间最小的机器进行分配。
将当前作业的加工时间加到对应的机器上。
重复步骤4和5,直到所有作业都分配完毕。
最终,完成任务的最短时间为task_time数组中的最大值。
三、代码实现
#include <stdio.h>
#include <stdlib.h>
// 比较函数,用于排序作业
int compare(const void *a, const void *b) {
return (*(int*)b - *(int*)a);
}
// 计算完成任务的最短时间
int shortestCompletionTime(int n, int m, int jobs[]) {
// 按处理时间从大到小排序作业
qsort(jobs, n, sizeof(int), compare);
// 初始化每台机器的当前总处理时间为0
int machines[m];
for (int i = 0; i < m; i++) {
machines[i] = 0;
}
// 将作业分配给机器
for (int i = 0; i < n; i++) {
// 找到当前处理时间最短的机器
int minIndex = 0;
for (int j = 1; j < m; j++) {
if (machines[j] < machines[minIndex]) {
minIndex = j;
}
}
// 分配作业给当前处理时间最短的机器,并更新其总处理时间
machines[minIndex] += jobs[i];
}
// 找到所有机器中总处理时间最长的时间
int maxTime = machines[0];
for (int i = 1; i < m; i++) {
if (machines[i] > maxTime) {
maxTime = machines[i];
}
}
return maxTime;
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
int jobs[n];
for (int i = 0; i < n; i++) {
scanf("%d", &jobs[i]);
}
// 计算并输出完成任务的最短时间
int shortestTime = shortestCompletionTime(n, m, jobs);
printf("%d", shortestTime);
return 0;
}
执行结果
结语
你今天偷的懒
都会成为你今后的难
!!!