请逐行解释下面代码:#include <stdio.h> #include <stdlib.h> #define MAX_N 200 typedef struct job { int deadline; int profit; int id; } Job; int cmp(const void *a, const void *b) { return ((Job *)b)->profit - ((Job *)a)->profit; } int main() { int n, i, j, k, max_profit = 0; Job jobs[MAX_N]; int selected[MAX_N] = {0}; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d%d", &jobs[i].deadline, &jobs[i].profit); jobs[i].id = i + 1; } qsort(jobs, n, sizeof(Job), cmp); for (i = 0; i < n; i++) { for (j = jobs[i].deadline - 1; j >= 0; j--) { if (!selected[j]) { selected[j] = jobs[i].id; max_profit += jobs[i].profit; break; } } } printf("%d\n", max_profit); for (i = 0; i < n; i++) { if (selected[i]) { printf("%d ", selected[i]); } } printf("\n"); return 0; }
时间: 2024-02-14 20:08:53 浏览: 59
这是一个求解任务调度问题的 C 语言程序,下面逐行解释:
```C
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 200
typedef struct job {
int deadline; // 任务截止时间
int profit; // 任务收益
int id; // 任务编号
} Job;
```
这里导入了两个标准库头文件,定义了一个宏 MAX_N 和一个任务的结构体 Job,其中包含任务的截止时间、任务的收益和任务的编号。
```C
int cmp(const void *a, const void *b) {
return ((Job *)b)->profit - ((Job *)a)->profit;
}
```
这是排序函数 cmp,它是用来对任务数组 jobs 进行降序排序的,排序的依据是任务的收益。这里使用了标准库的快速排序函数 qsort,它需要传入待排序数组的首地址、数组元素个数、元素大小和排序函数。
```C
int main() {
int n, i, j, k, max_profit = 0;
Job jobs[MAX_N];
int selected[MAX_N] = {0};
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d%d", &jobs[i].deadline, &jobs[i].profit);
jobs[i].id = i + 1;
}
qsort(jobs, n, sizeof(Job), cmp);
for (i = 0; i < n; i++) {
for (j = jobs[i].deadline - 1; j >= 0; j--) {
if (!selected[j]) {
selected[j] = jobs[i].id;
max_profit += jobs[i].profit;
break;
}
}
}
printf("%d\n", max_profit);
for (i = 0; i < n; i++) {
if (selected[i]) {
printf("%d ", selected[i]);
}
}
printf("\n");
return 0;
}
```
这是主函数,它首先定义了一些变量,包括任务个数 n、任务数组 jobs、已选择的任务 selected 和最大收益 max_profit,然后用 scanf 读入任务的截止时间和收益,并为每个任务赋予一个编号。接着使用 qsort 对任务数组 jobs 按照收益进行排序。
最后,程序使用贪心算法求解任务调度问题,首先遍历任务数组 jobs,对于每个任务,从它的截止时间开始往前遍历,如果当前时间点上还没有任务被选择,就将该任务选中,并将其收益加入最大收益中。最后输出最大收益和被选中的任务编号。
阅读全文