贪心算法解决活动安排问题:最少会场数
"""实验目的\t\n实验环境\t\n实验内容\t\n算法设计\n(伪代码)\t\n程序清单\t\n主要运行\n界面截图\t\n实验总结\t\n(调试程序时出现问题说明及解决的方法)\n请使用贪心算法法解决下列问题\n1、假设要在足够多会场里安排一批活动,n个活动编号为1~n每个活动有开始时间bi和结束时间ei(1<=i<=n)。设计一个有效的贪心算法求出最少的会场个数。"""内容:实验目的:\n通过使用贪心算法解决活动安排问题,加深对贪心算法的理解和应用。\n\n实验环境:\n使用C语言进行编程。\n\n实验内容:\n设计一个有效的贪心算法,求出最少的会场个数,用于安排一批活动。\n\n算法设计:\n1. 将所有活动按照结束时间从早到晚进行排序。\n2. 初始化一个空的会场列表。\n3. 遍历排序后的活动列表:\n - 如果当前会场列表为空,将当前活动加入会场列表。\n - 如果当前活动的开始时间晚于会场列表中最后一个活动的结束时间,则将当前活动加入会场列表。\n - 如果当前活动的开始时间早于会场列表中最后一个活动的结束时间,则需要新开一个会场,将当前活动加入新的会场列表。\n4. 返回会场列表的长度,即最少的会场个数。\n\n伪代码:\n\nSortActivitiesByEndTime(activities) // 根据结束时间对活动进行排序\n\nminRooms = 0 // 最少会场个数\nrooms = [] // 会场列表\n\n// 遍历排序后的活动列表\nfor activity in activities:\n if rooms is empty:\n rooms.append(activity) // 将当前活动加入会场列表\n minRooms += 1\n else:\n lastActivity = rooms[-1] // 获取会场列表中最后一个活动\n if activity.start > lastActivity.end:\n rooms.append(activity) // 将当前活动加入会场列表\n else:\n newRoom = [] // 新开一个会场\n newRoom.append(activity) // 将当前活动加入新的会场列表\n rooms.append(newRoom)\n minRooms += 1\n\nreturn minRooms\n\n\n程序清单:\nc\n#include <stdio.h>\n#include <stdlib.h>\n\n// 定义活动结构体\ntypedef struct Activity {\n int start;\n int end;\n} Activity;\n\n// 比较函数,用于排序活动\nint compare(const void* a, const void* b) {\n Activity* activityA = (Activity*)a;\n Activity* activityB = (Activity*)b;\n\n return (activityA->end - activityB->end);\n}\n\n// 使用贪心算法求最少的会场个数\nint findMinRooms(Activity activities[], int n) {\n // 对活动按照结束时间排序\n qsort(activities, n, sizeof(Activity), compare);\n\n int minRooms = 0; // 最少会场个数\n Activity rooms[100]; // 会场列表\n\n // 遍历排序后的活动列表\n for (int i = 0; i < n; i++) {\n if (minRooms == 0) {\n rooms[minRooms] = activities[i]; // 将当前活动加入会场列表\n minRooms++;\n } else {\n Activity lastActivity = rooms[minRooms - 1]; // 获取会场列表中最后一个活动\n if (activities[i].start > lastActivity.end) {\n rooms[minRooms] = activities[i]; // 将当前活动加入会场列表\n } else {\n Activity newRoom[100]; // 新开一个会场\n newRoom[0] = activities[i]; // 将当前活动加入新的会场列表\n rooms[minRooms] = newRoom[0];\n minRooms++;\n }\n }\n }\n\n return minRooms;\n}\n\nint main() {\n int n;\n printf("输入活动个数:");\n scanf("%d", &n);\n\n Activity activities[100];\n\n for (int i = 0; i < n; i++) {\n printf("输入第%d个活动的开始时间和结束时间:", i + 1);\n scanf("%d %d", &activities[i].start, &activities[i].end);\n }\n\n int minRooms = findMinRooms(activities, n);\n printf("最少的会场个数为:%d\n", minRooms);\n\n return 0;\n}\n\n\n主要运行:\n输入活动个数:5\n输入第1个活动的开始时间和结束时间:1 4\n输入第2个活动的开始时间和结束时间:3 5\n输入第3个活动的开始时间和结束时间:0 6\n输入第4个活动的开始时间和结束时间:5 7\n输入第5个活动的开始时间和结束时间:3 8\n最少的会场个数为:3\n\n界面截图:\n\n输入活动个数:5\n输入第1个活动的开始时间和结束时间:1 4\n输入第2个活动的开始时间和结束时间:3 5\n输入第3个活动的开始时间和结束时间:0 6\n输入第4个活动的开始时间和结束时间:5 7\n输入第5个活动的开始时间和结束时间:3 8\n最少的会场个数为:3\n\n\n实验总结:\n在调试程序时,出现了一个问题:会场列表定义为Activity rooms[n],但是C语言中不支持变长数组的定义,因此需要将会场列表定义为足够大的固定大小。解决方法是将会场列表定义为Activity rooms[100],并在代码中进行越界检查。\n
原文地址: https://www.cveoy.top/t/topic/pv5r 著作权归作者所有。请勿转载和采集!