用c语言写出该代码:问题描述:有n项活动申请使用同一场所,每项活动有一个开始和结束时间,如果任何两个活动不能重叠,问如何选择这些活动,使得被安排活动数量达到最多。 要求选择三种“贪心”策略进行比较,其中一个是最优的。 第一种策略:开始时间最早优先; 第二种策略:活动时间最短优先; 第三种策略:结束时间最早优先; 数据示例如下:n项活动的活动编号,开始时间和结束时间如下表所示(可自行生成活动数据): 活动编号 1 2 3 4 5 6 7 8 9 10 开始时间s 1 3 2 5 4 5 6 8 8 2 结束时间f 4 5 6 7 9 9 10 11 12 13
时间: 2024-02-22 16:58:37 浏览: 39
以下是用C语言实现的代码,实现了三种贪心策略,并比较它们的效率,其中第三种策略是最优的:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
typedef struct activity {
int id; // 活动编号
int s; // 开始时间
int f; // 结束时间
} Activity;
Activity acts[MAXN]; // 存储所有活动
int ans[MAXN]; // 存储最终结果
int cnt; // 存储最终结果的长度
// 按开始时间最早排序
int cmp1(const void* a, const void* b) {
Activity* p = (Activity*)a;
Activity* q = (Activity*)b;
return p->s - q->s;
}
// 按活动时间最短排序
int cmp2(const void* a, const void* b) {
Activity* p = (Activity*)a;
Activity* q = (Activity*)b;
return (p->f - p->s) - (q->f - q->s);
}
// 按结束时间最早排序
int cmp3(const void* a, const void* b) {
Activity* p = (Activity*)a;
Activity* q = (Activity*)b;
return p->f - q->f;
}
// 贪心选择活动
void select(Activity* acts, int n, int (*cmp)(const void*, const void*)) {
qsort(acts, n, sizeof(Activity), cmp);
int last = -1;
for (int i = 0; i < n; i++) {
if (last < 0 || acts[i].s >= acts[last].f) {
ans[cnt++] = acts[i].id;
last = i;
}
}
}
// 打印结果
void print_ans() {
printf("最优活动集合为:");
for (int i = 0; i < cnt; i++) {
printf("%d ", ans[i]);
}
printf("\n");
}
int main() {
int n;
printf("请输入活动数量:");
scanf("%d", &n);
printf("请依次输入每项活动的编号、开始时间和结束时间:\n");
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &acts[i].id, &acts[i].s, &acts[i].f);
}
select(acts, n, cmp1);
printf("按开始时间最早选择活动:\n");
print_ans();
cnt = 0;
select(acts, n, cmp2);
printf("按活动时间最短选择活动:\n");
print_ans();
cnt = 0;
select(acts, n, cmp3);
printf("按结束时间最早选择活动:\n");
print_ans();
return 0;
}
```
注意:这里给出的代码只是实现了三种贪心策略,并比较它们的效率,但并不是最优解。在实际情况中,可能需要使用其他算法来求解最优解。