活动安排问题#c语言#含解释

【活动安排问题】设有n个活动的集合E={1,2,...n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和fi,且si<fi。如果选择了活动i,则它在半开时间区间[si,fi)内占用资源。若区间[si,fi)和[sj,fj)不相交,则称活动i和活动j是相容的。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集和。

#include <stdio.h>  // 引入标准输入输出头文件
#include <stdlib.h> // 引入标准库头文件,用于调用qsort等函数

// 定义一个比较函数,用于qsort排序
int compare(const void *a, const void *b) {
    const int *x = (const int *)a; // 将void指针转换为int指针
    const int *y = (const int *)b; // 同上
    if (x[1] < y[1]) { // 如果第一个活动的结束时间小于第二个活动的结束时间
        return -1; // 返回-1,表示第一个活动排在前面
    } else {
        return 1; // 否则返回1,表示第二个活动排在前面
    }
}

// 主函数
int main() {
    int n; // 定义一个整数n,用于存储活动的数量
    scanf("%d", &n); // 使用scanf从标准输入读取一个整数,存储到n中
    
    int sf[n][2]; // 定义一个二维数组sf,用于存储活动的时间信息
    for (int i = 0; i < n; i++) { // 循环n次,读取每个活动的时间信息
        scanf("%d %d", &sf[i][0], &sf[i][1]); // 使用scanf读取活动的起始时间和结束时间
    }
    
    qsort(sf, n, sizeof(int) * 2, compare); // 使用qsort对数组sf进行排序,每次排序两个整数
    
    // 打印排序后的数组,供参考
    for (int i = 0; i < n; i++) {
        printf("%d %d\n", sf[i][0], sf[i][1]); // 打印每个活动的起始时间和结束时间
    }
    
    int f = 0, cont = 0; // 定义两个整数f和cont,分别用于存储当前活动的结束时间和活动计数
    for (int i = 0; i < n; i++) { // 循环n次,处理每个活动
        if (sf[i][0] >= f) { // 如果当前活动的起始时间大于或等于f
            f = sf[i][1]; // 更新f为当前活动的结束时间
            cont++; // 活动计数加1
        }
    }
    
    printf("%d\n", cont); // 打印活动计数
    
    return 0; // 程序结束
}

运行结果:

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法(Greedy Algorithm)是一种常用的算法思想,用于在求解最优化问题时进行决策。贪心算法每次都选择当前状态下的最优解,而不考虑对后续状态的影响。 在活动安排问题中,我们需要选择一系列互不冲突的活动,使得能够安排尽可能多的活动。假设我们有n个活动每个活动都有一个开始时间和结束时间。我们需要选择一些活动,使得它们互不冲突,并且能够安排尽可能多的活动。 以下是贪心算法解决活动安排问题的步骤: 1. 将所有活动按照结束时间从早到晚进行排序。 2. 选择第一个活动作为安排的第一个活动。 3. 从第二个活动开始,依次判断当前活动与已经安排的最后一个活动是否互不冲突。如果互不冲突,则将该活动加入安排中。 4. 重复步骤3,直到遍历完所有活动C语言实现贪心算法解决活动安排问题的代码如下所示: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int start; int end; } Activity; int compare(const void *a, const void *b) { return ((Activity *)a)->end - ((Activity *)b)->end; } void activitySelection(Activity activities[], int n) { qsort(activities, n, sizeof(Activity), compare); int i = 0; printf("Selected activities: %d ", i); for (int j = 1; j < n; j++) { if (activities[j].start >= activities[i].end) { printf("%d ", j); i = j; } } } int main() { Activity activities[] = {{1, 3}, {2, 5}, {4, 7}, {6, 9}, {8, 10}, {9, 12}}; int n = sizeof(activities) / sizeof(activities); activitySelection(activities, n); return 0; } ``` 上述代码中,我们使用结构体`Activity`来表示每个活动的开始时间和结束时间。`compare`函数用于排序活动数组,将其按照结束时间从早到晚进行排序。`activitySelection`函数实现了贪心算法的具体逻辑,遍历排序后的活动数组,选择互不冲突的活动并输出其索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值