2026/1/24 11:01:02
网站建设
项目流程
静态网站html,网站抓取超时错误,wordpress模板导入,wordpress 内网ip创作灵感在算法领域#xff0c;贪心算法以其 “局部最优推导全局最优” 的核心思想#xff0c;成为解决资源调度类问题的经典思路。活动安排问题作为贪心算法的典型应用场景#xff0c;能直观体现这一思想的价值。本文将从问题分析入手#xff0c;拆解贪心策略的设计逻辑贪心算法以其 “局部最优推导全局最优” 的核心思想成为解决资源调度类问题的经典思路。活动安排问题作为贪心算法的典型应用场景能直观体现这一思想的价值。本文将从问题分析入手拆解贪心策略的设计逻辑结合完整代码实现详解如何高效解决活动安排问题。一、问题背景与核心需求活动安排问题的核心场景是给定若干个共享同一资源如会议室、体育场的活动每个活动有唯一的开始时间和结束时间资源同一时间仅能被一个活动占用。我们需要找到一种安排方式使得能被成功安排的活动数量最多最大化资源利用率。以本文实现的场景为例假设有 10 个活动申请使用同一场地场地开放时间为 0 时至 24 时每个活动随机生成开始时间s和结束时间fs f需通过算法筛选出最多可安排的活动数量并输出每个活动的安排结果。二、贪心策略的核心思路解决活动安排问题的关键是确定 “局部最优” 的选择标准最优策略优先选择结束时间最早的活动。这一选择能最大程度为后续活动腾出时间是实现 “最多活动安排” 的核心逻辑。反证若先选结束晚的活动后续可选择的活动范围会大幅缩小无法保证全局最优。代码实现详解如何高效解决活动安排问题。三、完整代码实现与逐段解析#includecstdlib #includectime #includeiostream using namespace std; const int N10; // 活动总数 // 定义活动结构体存储核心信息 struct activity{ int No; // 活动编号 int s; // 开始时间 int f; // 结束时间 int conti; // 持续时间 }; // 选择排序按活动结束时间升序排列 void selectsort(activity a[]){ for(int i0;iN;i){ for(int ji1;jN;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 count0; // 记录可安排活动数量 int time0; // 场地最早可用时间初始为场地开放时间 for(int i0;iN;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 begin0,end24; // 场地开放时间0时-24时 cout场地开放时间:begin时-end时endl; activity a[N]; // 定义10个活动 // 随机生成每个活动的时间信息 for(int i0;iN;i){ a[i].No i; a[i].s rand()%end; // 开始时间0-23随机 // 结束时间大于开始时间且≤24 a[i].f a[i].s rand()%(end1 - 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原代码中错误地按活动编号排序此处修正为按结束时间升序排序 —— 这是贪心策略的核心前提。采用选择排序实现逻辑简单直观适合小规模数据N10的排序需求若活动数量增大可替换为效率更高的快速排序。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将活动时间轴可视化更直观地展示安排结果。