一.问题的描述

学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。
现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排才可以安排更多的活动。
具体的示例如下所示:

二.问题的分析

1.贪心算法的基本思想:
贪心算法在对问题进行求解的时候,总是做出当前看来是最好的选择,它会不从整体的最优进行考虑,而是得到在某种意义上的局部最优解,而且贪心算法不是对所有的问题都能得到整体的最优解,关键是贪心策略的的选择。不从整体上的最优加以考虑,做出的只是在某种意义上的局部最优解,贪心法中推进的每一步不是依据某一固定的递推式,而是当前看似最佳的贪心决策,不断的将问题归纳为更加小的相似的子问题,最后当初的大问题只剩下了一个最简单的小问题。
2.本题解决思路:
由于输入的活动以其完成的时间是非减序的排列,所以贪心算法每次都是选择具有最早完成时间的相容活动加入我们最终的输出序列中,按照这种方法选择相容的活动可以为没有安排的活动留下更多的时间。
3、具体的算法流程描述:

(1)输入我们需要进行安排的活动的数目n,以及依次输入每个待排序活动的开始时间和结束时间,将它们分别存放在数组s[ ]和f[ ]中。
(2)分别定义存放开始时间和结束时间的数组,使用排序将结束时间按照从小到大的顺序进行排列,得到最初排列好的数组。
(3)以排列后的第一个数组的结束时间为基准,依次在已排序的数列中找开始时间和结束时间不发生冲突的活动进行安排,最后输出安排好的活动。

三、源程序清单

编译环境:Dev C++

/*///测试数据/
请输入待排序的活动数目:
11
请依次输入每个活动的开始时间和结束时间:
3 8 0 6 3 5 8 11 6 10 8 12 5 7 2 13 1 4 12 14 5 9
/运行结果//
排序后的活动为:
(1, 4)  (3, 5)  (0, 6)  (5, 7)  (3, 8)  (5, 9)  (6, 10) (8, 11) (8, 12) (2, 13) (12, 14)
活动的具体安排如下所示:
(1, 4)  (5, 7)  (8, 11) (12, 14)
*/
#include "stdio.h"
#include "stdlib.h"
//函数的声明
void merge(int *s, int *f, int p, int q, int r);//使用归并进行排序
void sort(int *s, int *f, int p, int r);//对每个活动的终止时间进行排序
void active(int *s, int *f, int *b, int n, int &count);//设置活动安排函数
//其中数组b中存放的是标志0和1,显示活动是否被安排,如果活动被安排,就显示1,否则,显示0.
int main()//主函数
{int i, n, count = 0;//count 记录入围的活动数目,n是我们需要输入的总的活动个数 printf("请输入待排序的活动数目:\n"); scanf("%d", &n);//输入待排序的活动的数目 int *s = (int *)malloc(sizeof(int) * n);int *f = (int *)malloc(sizeof(int) * n);int *b = (int *)malloc(sizeof(int) * n);//为数组分配相应大小的空间,记录入围的活动下标;printf("请依次输入每个活动的开始时间和结束时间:\n");for(i = 0; i < n; i++){scanf("%d%d", &s[i], &f[i]);//将活动的时间分别存到两个数组中 b[i] = 0;}printf("排序后的活动为:\n"); active(s, f, b, n, count);//显示最终排序后活动的结果 printf("活动的具体安排如下所示:\n");for(i = 0; i < count; i++){printf("(%d, %d)\t", s[b[i]], f[b[i]]);//输出最终安排的活动 }printf("\n");return 0;
}void merge(int *s, int *f, int p, int q, int r)//归并排序
{int i, j, k;int n1 = q - p + 1;int n2 = r - q;int *ls = (int *)malloc(sizeof(int) * (n1 + 1));int *lf = (int *)malloc(sizeof(int) * (n1 + 1));int *rs = (int *)malloc(sizeof(int) * (n2 + 1));int *rf = (int *)malloc(sizeof(int) * (n2 + 1));//分别为数组分配相应的空间 for(i = 0; i < n1; i++){ls[i] = s[p + i];lf[i] = f[p + i];}ls[i] = 0;lf[i] = 24;//规定范围(时间在0-24范围之内)for(i = 0; i < n2; i++){rs[i] = s[q + 1 + i];rf[i] = f[q + 1 + i];}rs[i] = 0;rf[i] = 24;//规定范围(时间在0-24范围之内) i = 0;j = 0;for(k = p; k <= r; k++){if(lf[i] >= rf[j]){s[k] = rs[j];f[k] = rf[j];//如果左边的时间数字大于右边,则交换位置 j++;}else{s[k] = ls[i];f[k] = lf[i]; i++;}}
}void sort(int *s, int *f, int p, int r)
{if(p < r){int q = ( p + r) / 2;sort(s, f, p, q);//利用递归将活动的结束时间分别进行排序 sort(s, f, q + 1, r);merge(s, f, p, q, r);//使用一次归并排序 }
}void active(int *s, int *f, int *b, int n, int &count)
{int i, j = 0;sort(s, f, 0, n-1);//首先对结束时间进行排序 for(i = 0; i < n; i++){printf("(%d, %d)\t", s[i], f[i]);//输入将结束时间由小到大排列好的所有活动 }printf("\n");b[0] = 0;//数组b显示的是标志0和1 count = 1;//计数 for(i = 1; i < n; i++){if(s[i] >= f[b[count - 1]]){b[count++] = i;}}
}

四.运行结果


五.总结

贪心算法,在求解过程中,并不追求全局最优解,而是追求每一步的最优,所以贪心算法也不保证一定能够获得全局最优解,但是贪心算法在很多问题上可以求得最优解。
贪心算法选择的是在每一步的当前选择看来最好的那一个,它是逐步将问题简化,从而最终也只会剩余一个子问题,针对活动选择问题,我们一开始有n个活动,所以我们事先要选择结束最早的那个活动,这样才可以为接下来的活动腾出更多的时间来安排。

基于贪心算法的活动安排问题相关推荐

  1. 算法笔记(0002) - 【贪心算法】活动安排问题

    贪心算法 原理 在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许 ...

  2. 贪心算法解决活动安排-Python实现(排序+贪心选择)

    贪心算法解决活动安排 问题 问题概述 分析问题 解决问题 编程 编程流程以及数据类型选择 发现问题以及解决 最终实现 总结 程序缺陷以及完善 解题心路历程 问题 问题概述 设有n个活动的集合E={1, ...

  3. 贪心算法之活动安排问题C语言代码

    贪心算法之活动安排问题C语言 问题描述 该问题要求高效地安排一系列争用某一公共资源的活动. n:活动的个数,其中每个活动都要求使用同一资源,如演讲会场等.而且在同一时间内只有一个活动能使用这一资源. ...

  4. 贪心算法实现活动安排问题

    贪心算法实现活动安排问题: 设有n个活动的集合E={1,2,...,n},其中,每个活动都要求使用同一资源,如演讲会场等,而在同一时间内,只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的 ...

  5. 贪心算法之活动安排问题(填表详解+思路解析)

    贪心算法 总是选择当前看起来最优的选择(局部最优解),得到的结果是一个整体最优解. 但是总是选择局部最优解并不总是能得到整体最优解,需要在问题具有:贪心选择性和优化子结构时才成立. 贪心选择性:第一次 ...

  6. 贪心算法-02活动安排问题

    活动安排问题 简介 活动安排问题是需要共享公共资源的一系列活动的高效安排问题,以在限定的资源前提下尽可能多地安排活动.一般,算法题中给出开始结束时间的活动序列都可以使用这种贪心思路. 问题描述 有若干 ...

  7. C++编程笔记:贪心算法实现活动安排问题

    问题描述: 设有n个活动的集合E={1,2,-,n},其中,每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且s ...

  8. 贪心算法之 活动安排(Java代码实现)

    活动安排问题 – 资源争夺 问题描述 设有 n 个活动的集合 A = {1, 2, - , n}, 其中每个活动都要求使用同一资源,而在同一时间段内只有一个活动能使用资源 要求高效安排一系列争用公共资 ...

  9. 【贪心算法】活动安排问题

    活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子. 该问题要求高效地安排一系列争用某一公共资源的活动. 贪心算法提供了一个简单.漂亮的方法使得尽可能多的 ...

最新文章

  1. jquery ajaxSubmit
  2. UA MATH564 概率论VI 数理统计基础3 卡方分布的正态近似
  3. csu 1019 Simple Line Editor
  4. Linux源代码软件安装,Linux软件安装:源代码与软件安装
  5. 如何在C++Builder中使用全局变量
  6. JSONP的诞生、原理及应用实例
  7. boost::hana模块在无限可迭代对象上测试 hana::index_if
  8. boost::graph模块BC聚类算法程序的实现
  9. scikit-learn 梯度提升树(GBDT)调参小结
  10. Java tate只要年月日,Java初學者入門必須掌握的30個基本概念
  11. 使用jsp打印HTTP请求头部所有字段的值
  12. 主成分分析法_主成分分析法在地震学领域的新应用
  13. leetcode74. 搜索二维矩阵(二分查找)
  14. STL源码剖析 数值算法 copy_backward 算法
  15. 消息中间件 --- Kafka快速入门
  16. 【JavsScript】关于javascript的路线
  17. 密码学研究-加密解密
  18. 实例验证WEB浏览器智能应对节点失效
  19. 查看linux的机器内存大小,linux 查看机器内存方法 (free命令)
  20. vSphere vMotion

热门文章

  1. 系统平台京东店铺运营
  2. Android Activity 滑动返回。支持微信滑动返回样式、横屏滑动返回、全屏滑动返回
  3. 重点|视频面试技巧和注意事项有哪些
  4. VLC 屏幕录像时录制鼠标的方法:
  5. 10年磨一剑,软件编程走火入魔之:把简单的功能做个彻彻底底、把劳动成果重复利用
  6. matlab函数randi,Matlab之rand(), randn(), randi()函数的使用方法
  7. PCB Stack设计规范
  8. 西门子PLC200SMART恒压供水通讯案例
  9. 开源测试框架-UI自动化测试工具Selenium的安装与常用操作-Java语言
  10. spark (3)Spark Standalone集群安装介绍