news 2026/8/18 15:32:41

活动安排问题的贪心算法实践与代码解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
活动安排问题的贪心算法实践与代码解析

创作灵感

在算法领域,贪心算法以其 “局部最优推导全局最优” 的核心思想,成为解决资源调度类问题的经典思路。活动安排问题作为贪心算法的典型应用场景,能直观体现这一思想的价值。本文将从问题分析入手,拆解贪心策略的设计逻辑,结合完整代码实现,详解如何高效解决活动安排问题。

一、问题背景与核心需求

活动安排问题的核心场景是:给定若干个共享同一资源(如会议室、体育场)的活动,每个活动有唯一的开始时间和结束时间,资源同一时间仅能被一个活动占用。我们需要找到一种安排方式,使得能被成功安排的活动数量最多,最大化资源利用率。

以本文实现的场景为例:假设有 10 个活动申请使用同一场地,场地开放时间为 0 时至 24 时,每个活动随机生成开始时间s和结束时间fs < f),需通过算法筛选出最多可安排的活动数量,并输出每个活动的安排结果。

二、贪心策略的核心思路

解决活动安排问题的关键,是确定 “局部最优” 的选择标准:

  • 最优策略:优先选择结束时间最早的活动。这一选择能最大程度为后续活动腾出时间,是实现 “最多活动安排” 的核心逻辑。
  • 反证:若先选结束晚的活动,后续可选择的活动范围会大幅缩小,无法保证全局最优。

代码实现,详解如何高效解决活动安排问题。

三、完整代码实现与逐段解析

#include<cstdlib> #include<ctime> #include<iostream> using namespace std; const int N=10; // 活动总数 // 定义活动结构体,存储核心信息 struct activity{ int No; // 活动编号 int s; // 开始时间 int f; // 结束时间 int conti; // 持续时间 }; // 选择排序:按活动结束时间升序排列 void selectsort(activity a[]){ for(int i=0;i<N;i++){ for(int j=i+1;j<N;j++){ if(a[j].f < a[i].f){ // 核心:按结束时间升序 activity x = a[i]; a[i] = a[j]; a[j] = x; } } } } // 贪心算法核心:筛选可安排的活动 int greedy(activity a[]){ selectsort(a); // 先排序,保证贪心策略执行基础 int count=0; // 记录可安排活动数量 int time=0; // 场地最早可用时间(初始为场地开放时间) for(int i=0;i<N;i++){ // 核心条件:当前活动开始时间 ≥ 场地可用时间,无冲突 if(a[i].s >= time){ count++; time = a[i].f; // 更新场地可用时间为当前活动结束时间 cout<<"活动"<<a[i].No<<"要求占用"<<a[i].s<<"时至"<<a[i].f<<"时,可以安排,场地从"<<time<<"时开始空闲"<<endl; } else { cout<<"活动"<<a[i].No<<"要求占用"<<a[i].s<<"时至"<<a[i].f<<"时,与场地最早空闲时间"<<time<<"时冲突,不能安排"<<endl; } } return count; // 返回最多可安排活动数 } int main(){ srand((unsigned)time(NULL)); // 初始化随机数种子,保证每次运行结果不同 int begin=0,end=24; // 场地开放时间:0时-24时 cout<<"场地开放时间:"<<begin<<"时-"<<end<<"时"<<endl; activity a[N]; // 定义10个活动 // 随机生成每个活动的时间信息 for(int i=0;i<N;i++){ a[i].No = i; a[i].s = rand()%end; // 开始时间:0-23随机 // 结束时间:大于开始时间,且≤24 a[i].f = a[i].s + rand()%(end+1 - a[i].s); a[i].conti = a[i].f - a[i].s; cout<<"活动"<<a[i].No<<"要求占用"<<a[i].s<<"至"<<a[i].f<<"时"<<endl; } // 调用贪心算法,输出结果 cout<<"最多可安排"<<greedy(a)<<"个活动"<<endl; return 0; }
(1)数据结构定义

通过activity结构体封装每个活动的编号、开始时间、结束时间、持续时间,便于统一管理和排序操作,符合面向过程编程中 “数据聚合” 的设计思路。

(2)排序函数selectsort
  • 原代码中错误地按活动编号排序,此处修正为按结束时间升序排序 —— 这是贪心策略的核心前提。
  • 采用选择排序实现,逻辑简单直观,适合小规模数据(N=10)的排序需求;若活动数量增大,可替换为效率更高的快速排序。
(3)贪心核心函数greedy
  • 排序后遍历所有活动,通过time变量记录场地当前最早可用时间,初始值为场地开放时间(0 时)。
  • 核心判断条件a[i].s >= time:确保当前活动与已安排活动无时间冲突,满足条件则安排该活动,并更新time为当前活动的结束时间。
  • 实时输出每个活动的安排结果,便于直观验证算法逻辑,同时返回最终安排的活动总数。
(4)主函数main

六、总结

活动安排问题的核心是贪心算法 “局部最优” 策略的落地 —— 通过选择结束时间最早的活动,实现全局最多活动的安排。本文从问题分析到代码实现,修正了原代码的核心错误(排序逻辑),完善了随机数生成逻辑,同时拆解了每个模块的设计思路。

通过本次实践可深刻体会:贪心算法的关键在于 “最优子结构” 的识别(即局部最优能推导全局最优),而代码实现的细节(如排序依据、条件判断)直接决定算法是否有效。掌握这一思路后,可将其迁移到区间调度、任务选择等同类问题中,提升算法应用能力。

题——

  • 初始化随机数种子:取消原代码中rand的注释,保证每次运行生成不同的活动时间,模拟真实场景的随机性。
  • 随机生成活动时间:通过rand()函数控制开始时间范围为 0-23,结束时间大于开始时间且≤24,避免出现无效的时间区间。
  • 输出初始活动信息和最终安排结果,形成完整的流程闭环。
  • 拓展与优化方向

  • 排序优化:当活动数量 N 增大时,选择排序的 O (n²) 时间复杂度效率较低,可替换为sort函数(基于快速排序,O (n log n)),需为结构体重载比较规则。
  • 边界条件增强:可增加对活动结束时间超过场地关闭时间(24 时)的判断,直接标记为不可安排,进一步提升代码健壮性。
  • 带权活动扩展:若每个活动有不同的权重(如收益),需调整贪心策略为 “按单位时间收益排序”,或采用动态规划解法,满足更复杂的业务需求。
  • 可视化展示:结合图表库(如 Matplotlib)将活动时间轴可视化,更直观地展示安排结果。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 12:59:59

33、网络管理与UUCP使用指南

网络管理与UUCP使用指南 1. NetWare相关操作 在Linux系统中,与NetWare相关的操作有多种,下面为你详细介绍。 1.1 slist命令 执行 slist 命令时不需要提供参数,其输出会展示文件服务器名称、IPX网络地址以及主机地址。示例输出如下: NPPWR-31-CD01 23A91330 0000000…

作者头像 李华
网站建设 2026/8/17 3:45:48

C++核心语法复盘:数据结构编程的底层基石

个人首页&#xff1a; 永远都不秃头的程序员(互关) C语言专栏:从零开始学习C语言 C专栏:C的学习之路 人工智能专栏&#xff1a;人工智能从 0 到 1&#xff1a;普通人也能上手的实战指南 本文章所属专栏&#xff1a;C学习笔记:数据结构的学习之路 目录 引言 一、指针与引用…

作者头像 李华
网站建设 2026/8/19 0:18:58

43、Exim邮件服务器配置与管理全解析

Exim邮件服务器配置与管理全解析 1. 邮件队列处理与监控 在Exim中,我们可以通过命令行选项来处理邮件队列。使用 q15m 选项可以让Exim每15分钟处理一次队列,也可以通过 cron 定期调用 exim -q 命令来实现同样的效果。 要显示当前的邮件队列,可以使用 -bp 选项调用…

作者头像 李华
网站建设 2026/8/17 18:19:08

48、互联网新闻服务器INN与NNTP的使用与配置指南

互联网新闻服务器INN与NNTP的使用与配置指南 1. NNTP访问与授权 NNTP(网络新闻传输协议)是互联网上传输新闻文章的常用协议。在使用NNTP时, nntp_access 文件用于控制不同主机的访问权限。以下是一个示例 nntp_access 文件: # # by default, anyone may transfer n…

作者头像 李华
网站建设 2026/8/17 3:12:49

我发现动态时间戳对齐破解跨境急诊预警延迟

&#x1f4dd; 博客主页&#xff1a;Jax的CSDN主页 目录 当AI开始帮我写病历&#xff0c;我差点以为它会当医生了 一、AI医生的"作弊开挂"日常 二、AI炼药厂的"魔法时刻" 三、AI看病的"坑"与"甜" 四、AI医疗的"未来已来" 五…

作者头像 李华
网站建设 2026/8/18 16:54:55

面试官:如何提升AIGC生成的可控性?

当前&#xff0c;AIGC的可控生成好发顶会正成为诸多多模态生成研究者的共识。顶会录用的关键是 “新颖性”&#xff0c;而可控生成的技术栈仍处于快速迭代期&#xff0c;存在大量未被挖掘的创新点。比如下面的几个可创新方向。目前还存在大量可发顶会的工作可做。可创新方向研究…

作者头像 李华