详细解释一下这段代码的思路 #include <stdio.h>#include <stdlib.h>#define MAX_N 200typedef struct { int deadline; // 截止期限 int profit; // 效益 int index; // 作业编号} Job;int n;Job jobs[MAX_N];int cmp(const void *a, const void *b) { const Job *p = (const Job *)a; const Job *q = (const Job *)b; return q->profit - p->profit;}int main() { // 输入作业信息 scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d%d", &jobs[i].deadline, &jobs[i].profit); jobs[i].index = i + 1; } // 按照效益从大到小排序 qsort(jobs, n, sizeof(Job), cmp); // 集合树方法求解 int result = 0; // 最大效益值 int time = 0; // 当前时间 int *set = (int *)calloc(n + 1, sizeof(int)); // 集合树 for (int i = 0; i < n; i++) { int j = jobs[i].deadline; while (j > 0 && set[j]) j--; if (j > 0) { set[j] = jobs[i].index; result += jobs[i].profit; time++; } } // 输出结果 printf("%d\n", result); for (int i = 1; i <= n; i++) { if (set[i]) { printf("%d", set[i]); time--; if (time) printf(" "); } } printf("\n"); return 0;}
时间: 2024-02-02 19:04:28 浏览: 195
栈和队列的基础上设计模拟停车场管理程序 停车场管理问题 #include<stdio.h> #include<stdlib.h> struct { char status; int num; int time; }a; /*命令的结构*/ typedef struct{ int num; int time; }Element; struct { Element *base; Element *top; in
这段代码实现了一种作业调度算法,其基本思路是按照每个作业的效益从大到小排序,然后使用集合树方法求解最大效益值。
具体实现过程如下:
1. 定义一个 Job 结构体,包含三个成员变量:截止期限、效益和作业编号。
2. 读入作业信息,包括作业数量、每个作业的截止期限和效益,同时为每个作业编号赋值。
3. 将所有作业按照效益从大到小排序,这里使用了标准库函数 qsort()。
4. 使用集合树方法求解最大效益值,具体过程如下:
a. 定义一个 int 类型的指针 set,表示集合树,初始化为全 0。
b. 遍历排序后的作业列表,对于每个作业,从其截止期限开始向前搜索集合树,找到第一个空位置插入该作业。
c. 如果找到了空位置,表示该作业可以被安排,更新最大效益值 result,同时当前时间 time 加一。
5. 输出结果,包括最大效益值和被安排的作业编号列表。
注意,集合树的作用是记录每个时间点上已经被安排的作业编号,从而避免了同一时间点上多个作业的冲突。在遍历作业列表时,我们一次次地向前搜索集合树,找到第一个空位置插入该作业,这样就能保证安排作业的时间尽可能靠前,从而最大化效益。
阅读全文