请用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-11 12:03:46 浏览: 48
C语言用三种策略实现贪心算法
好的,以下是三种贪心策略的C语言代码实现:
1. 开始时间最早优先
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_ACTIVITY_NUM 100
// 活动结构体
typedef struct {
int id; // 活动编号
int start; // 活动开始时间
int finish; // 活动结束时间
} Activity;
// 按照开始时间从早到晚排序
int cmp_by_start(const void *a, const void *b) {
return ((Activity *)a)->start - ((Activity *)b)->start;
}
Activity *earliest_start_time(Activity activity_list[], int n, int *chosen_num) {
Activity *chosen_activities = (Activity *)malloc(n * sizeof(Activity));
// 按照开始时间从早到晚排序
qsort(activity_list, n, sizeof(Activity), cmp_by_start);
// 选择开始时间最早的活动
chosen_activities[0] = activity_list[0];
int last_finish_time = activity_list[0].finish;
int i, j = 1;
// 从剩下的活动中选择开始时间最早且不与已选活动重叠的活动
for (i = 1; i < n; i++) {
if (activity_list[i].start >= last_finish_time) {
chosen_activities[j++] = activity_list[i];
last_finish_time = activity_list[i].finish;
}
}
*chosen_num = j;
return chosen_activities;
}
int main() {
int n = 10;
Activity activity_list[MAX_ACTIVITY_NUM] = {
{1, 1, 4},
{2, 3, 5},
{3, 2, 6},
{4, 5, 7},
{5, 4, 9},
{6, 5, 9},
{7, 6, 10},
{8, 8, 11},
{9, 8, 12},
{10, 2, 13}
};
int chosen_num;
Activity *chosen_activities = earliest_start_time(activity_list, n, &chosen_num);
printf("开始时间最早优先:");
for (int i = 0; i < chosen_num; i++) {
printf(" %d", chosen_activities[i].id);
}
printf("\n");
free(chosen_activities);
return 0;
}
```
2. 活动时间最短优先
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_ACTIVITY_NUM 100
// 活动结构体
typedef struct {
int id; // 活动编号
int start; // 活动开始时间
int finish; // 活动结束时间
} Activity;
// 按照活动时间从短到长排序
int cmp_by_time(const void *a, const void *b) {
return ((Activity *)a)->finish - ((Activity *)a)->start - ((Activity *)b)->finish + ((Activity *)b)->start;
}
Activity *shortest_activity_time(Activity activity_list[], int n, int *chosen_num) {
Activity *chosen_activities = (Activity *)malloc(n * sizeof(Activity));
// 按照活动时间从短到长排序
qsort(activity_list, n, sizeof(Activity), cmp_by_time);
// 选择活动时间最短的活动
chosen_activities[0] = activity_list[0];
int last_finish_time = activity_list[0].finish;
int i, j = 1;
// 从剩下的活动中选择活动时间最短且不与已选活动重叠的活动
for (i = 1; i < n; i++) {
if (activity_list[i].start >= last_finish_time) {
chosen_activities[j++] = activity_list[i];
last_finish_time = activity_list[i].finish;
}
}
*chosen_num = j;
return chosen_activities;
}
int main() {
int n = 10;
Activity activity_list[MAX_ACTIVITY_NUM] = {
{1, 1, 4},
{2, 3, 5},
{3, 2, 6},
{4, 5, 7},
{5, 4, 9},
{6, 5, 9},
{7, 6, 10},
{8, 8, 11},
{9, 8, 12},
{10, 2, 13}
};
int chosen_num;
Activity *chosen_activities = shortest_activity_time(activity_list, n, &chosen_num);
printf("活动时间最短优先:");
for (int i = 0; i < chosen_num; i++) {
printf(" %d", chosen_activities[i].id);
}
printf("\n");
free(chosen_activities);
return 0;
}
```
3. 结束时间最早优先
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_ACTIVITY_NUM 100
// 活动结构体
typedef struct {
int id; // 活动编号
int start; // 活动开始时间
int finish; // 活动结束时间
} Activity;
// 按照结束时间从早到晚排序
int cmp_by_finish(const void *a, const void *b) {
return ((Activity *)a)->finish - ((Activity *)b)->finish;
}
Activity *earliest_finish_time(Activity activity_list[], int n, int *chosen_num) {
Activity *chosen_activities = (Activity *)malloc(n * sizeof(Activity));
// 按照结束时间从早到晚排序
qsort(activity_list, n, sizeof(Activity), cmp_by_finish);
// 选择结束时间最早的活动
chosen_activities[0] = activity_list[0];
int last_finish_time = activity_list[0].finish;
int i, j = 1;
// 从剩下的活动中选择结束时间最早且不与已选活动重叠的活动
for (i = 1; i < n; i++) {
if (activity_list[i].start >= last_finish_time) {
chosen_activities[j++] = activity_list[i];
last_finish_time = activity_list[i].finish;
}
}
*chosen_num = j;
return chosen_activities;
}
int main() {
int n = 10;
Activity activity_list[MAX_ACTIVITY_NUM] = {
{1, 1, 4},
{2, 3, 5},
{3, 2, 6},
{4, 5, 7},
{5, 4, 9},
{6, 5, 9},
{7, 6, 10},
{8, 8, 11},
{9, 8, 12},
{10, 2, 13}
};
int chosen_num;
Activity *chosen_activities = earliest_finish_time(activity_list, n, &chosen_num);
printf("结束时间最早优先:");
for (int i = 0; i < chosen_num; i++) {
printf(" %d", chosen_activities[i].id);
}
printf("\n");
free(chosen_activities);
return 0;
}
```
使用示例和C语言代码中的数据一致,可以自行修改数据进行测试。
阅读全文