C语言贪心法:多机调度问题的算法设计与代码实现
了解了,这是一个典型的多机调度问题,目标是将多个任务分配到若干台机器上,使得所有任务完成的时间尽可能早。下面是一个使用C语言实现的贪心算法示例: ```c #include <stdio.h> #include <stdlib.h> // 比较函数,用于qsort排序 int compare(const void *a, const void *b) { return (*(int *)b - *(int *)a); } int main() { int n, m; // 输入任务数量 printf("请输入任务数量: "); scanf("%d", &n); // 输入任务处理时间 int tasks[n]; printf("请输入任务处理时间: "); for (int i = 0; i < n; i++) { scanf("%d", &tasks[i]); } // 输入机器数量 printf("请输入机器数量: "); scanf("%d", &m); // 对任务处理时间进行降序排序 qsort(tasks, n, sizeof(int), compare); // 初始化机器的当前处理时间和任务列表 int machine_time[m] = {0}; int machine_tasks[m][n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { machine_tasks[i][j] = -1; } } // 分配任务 for (int i = 0; i < n; i++) { int min_time = machine_time[0]; int min_index = 0; // 找到当前处理时间最短的机器 for (int j = 1; j < m; j++) { if (machine_time[j] < min_time) { min_time = machine_time[j]; min_index = j; } } // 将任务分配给该机器 machine_time[min_index] += tasks[i]; machine_tasks[min_index][i] = tasks[i]; } // 输出结果 printf("机器编号 任务\n"); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (machine_tasks[i][j] != -1) { printf("%d %d\n", i, machine_tasks[i][j]); } } } return 0; } ``` ### 需要注意的逻辑点 1. **任务排序**:在分配任务之前,先对任务处理时间进行降序排序。这样可以确保处理时间较长的任务优先分配,从而减少总的完成时间。 2. **机器选择**:每次分配任务时,选择当前处理时间最短的机器。这可以通过遍历所有机器的当前处理时间来实现。 3. **任务记录**:为了方便输出结果,需要记录每个机器分配的任务。这里使用了一个二维数组 `machine_tasks` 来存储每个机器的任务列表。 希望这段代码和解释对你有帮助!如果有任何问题或需要进一步优化的地方,请告诉我。 ######[AI写代码神器 | 665点数解答 | 2024-11-27 08:39:39]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)457
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)354
- C++ 破解“没有 3 的世界”:找出第 n 个特殊正整数!(字节豆包 | 333点数解答 | 2025-03-17 22:48:43)150
- Python切片操作巧解经典算法:二维数组90°旋转(阿里通义 | 205点数解答 | 2023-10-31 11:05:29)333
- 揭秘iOS开发:常用算法大集合,提升应用性能与体验!(阿里通义 | 246点数解答 | 2023-11-08 00:43:08)288
- 深入解析:Vue2.x与Vuex3.x渲染器的Diff算法奥秘(阿里通义 | 222点数解答 | 2023-11-09 01:35:41)361
- 突破 long 范围限制:用 BigInteger 类实现超大数字竖式乘法运算( | 555点数解答 | 2024-03-17 10:56:49)363
- 超范围数字乘法:字符串转数组+模拟竖式运算的实现攻略( | 377点数解答 | 2024-03-17 10:58:21)364
- Java 实现:突破 long 范围限制,模拟竖式运算处理大数字乘法( | 14点数解答 | 2024-03-17 10:58:39)342
- Java实现:突破long范围限制,模拟人工竖式运算大数字乘法( | 1022点数解答 | 2024-03-17 10:59:43)348