• 实验:贪心算法


    实验二:贪心算法

    【实验目的】

    应用贪心算法求解活动安排问题

    【实验性质】

    验证性实验。

    【实验要求】

    活动安排问题是可以用贪心算法有效求解的很好的例子。

    问题:有n个活动的集合A={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。

    求解:安排尽量多项活动在该场地进行,即求A的最大相容子集。

    设待安排的11个活动的开始时间和结束时间按结束时间的升序排列如下:

    i

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    s[i]

    1

    3

    0

    5

    3

    5

    6

    8

    8

    2

    12

    f[i]

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    将此表数据作为实现该算法的测试数据。

    【算法思想及处理过程】

    1.定义了活动结构体Activity,包含活动的名称name、开始时间start和结束时间end。

    2.定义了比较函数compare,用于按照活动的结束时间升序排序。

    3.定义了一个活动安排函数activityArrangement,接受一个活动数组和活动个数作为参数,并按照活动结束时间排序后进行活动安排。

    4.在活动安排函数中,首先使用sort函数对活动数组进行排序,排序规则是使用之前定义的比较函数compare。

    5.输出第一个活动的信息。

    6.初始化一个变量lastEnd,用于记录最后一个加入最大相容子集的活动的结束时间。

    7.遍历剩下的活动数组,如果当前活动的开始时间晚于等于lastEnd,即活动不与已加入的活动冲突,将该活动加入最大相容子集,并更新lastEnd为该活动的结束时间。

    8.输出结果。

    在主函数中,首先获取用户输入的活动个数,然后根据输入的活动个数循环获取活动的名称、开始时间和结束时间。最后调用活动安排函数(activityArrangement)进行活动安排。

    【程序代码】

    #include

    #include

    using namespace std;

    struct Activity {

        int name;

        int start;

        int end;

    };

    bool compare(Activity a, Activity b) {

        return a.end < b.end;

    }

    void activityArrangement(Activity activities[], int n) {

        sort(activities, activities + n, compare);

        cout << "结果为: "<

        cout << "Activite " << activities[0].name << "=" << activities[0].start << ", " << activities[0].end <

        int lastEnd = activities[0].end;

        for (int i = 1; i < n; i++) {

            if (activities[i].start >= lastEnd) {

                cout << "Activite "<

                lastEnd = activities[i].end;

            }

        }

        cout << endl;

    }

    int main() {

        int n;

        cout << "请输入活动个数: ";

        cin >> n;

        Activity activities[50];

        for (int i = 0; i < n; i++) {

            cout << "请输入第"<

            cin >> activities[i].name >> activities[i].start >> activities[i].end;

        }

        activityArrangement(activities, n);

        return 0;

    }

    【运行结果】

    自行运行截图

    【算法分析】

    排序算法的时间复杂度:使用了STL的sort函数对活动数组进行排序,该函数的时间复杂度为 O(nlogn),其中n为活动个数。

    遍历活动数组的时间复杂度:在活动安排函数中,遍历了剩下的活动数组,时间复杂度为 O(n),其中n为活动个数。

    综上,代码的时间复杂度为 O(nlogn + n),即 O(nlogn)。

  • 相关阅读:
    【JavaEE进阶系列 | 从小白到工程师】基本类型包装类的使用,装箱以及拆箱与parseInt方法
    「太阁干货」详细解析MPLS转发原理
    tailwindcss引入项目的正确‘姿势’
    LeetCode-828. 统计子串中的唯一字符【哈希表,字符串,动态规划】
    无主复制系统(1)-节点故障时写DB
    如何正确实现一个自定义Exception(二)
    深入了解 Axios 的 put 请求:使用技巧与最佳实践
    FFmpeg内存IO模式
    ES复杂操作搜索
    代码随想录算法训练营第五十一天|309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费
  • 原文地址:https://blog.csdn.net/G856569566/article/details/139638835