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

  设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi]内占用资源。若区间[si, fi]与区间[sj, fj]不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。

  由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。

  此算法的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。

  贪心算法并不总能求得问题的整体最优解。但对于活动安排问题,贪心算法却总能求得的整体最优解,即它最终所确定的相容活动集合A的规模最大。这个结论可以用数学归纳法证明。

算法模版:

template <class Type>
void GreedySelector(int n,Type s[],Type f[],bool A[])
{A[1] = true;int j=1;for(int i=2;i<=n;i++){if(s[i]>=f[j]){A[i] = true;j=i;}elseA[i] = false;}
}


应用实例:

问题描述:

Problem Description
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)Input
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。Sample Input
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0Sample Output
5

代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
typedef struct
{int s;int e;
}node;
int cmp(const void *a,const void *b)
{return ((node *)a)->e-((node *)b)->e;
}
int main()
{int n,i,j,c;node a[1000];while(scanf("%d",&n),n){for(i=0;i<n;i++)scanf("%d%d",&a[i].s,&a[i].e);qsort(a,n,sizeof(a[0]),cmp); //按结束时间升序排列c=1;i=0;for(j=1;j<n;j++){if(a[j].s>=a[i].e) {c++;i=j;}}printf("%d\n",c);}return 0;
}

活动安排问题--贪心算法相关推荐

  1. 活动安排问题(贪心算法)

    问题描述: 有n个活动的活动集合E ,其中每一个活动都要求使用同一个资源,而在同一个时刻内资源只能被一个活动使用,每一个活动都有开始是时间和结束时间,要求从活动集合E中选出m个活动,使着m个活动都能顺 ...

  2. 活动安排问题(贪心)

    活动安排问题(贪心) 有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? Input 第一行一个正整数n (n <= ...

  3. java活动安排_贪心法求解活动安排(java实现)

    贪心法描述: 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优 ...

  4. C语言会场安排问题贪心算法,贪心算法解决会场安排问题多处最优服务次序问题(含源代码).doc...

    贪心算法解决会场安排问题多处最优服务次序问题(含源代码) 西 安年月日-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源 ...

  5. 活动安排问题-计算机算法

    贪心算法 基本思想 在对问题求解时,总是遵循某种规则做出在当前看来是最好的选择,期待通过所做的局部最优选择来产生一个全局最优解. 缺点 贪心算法不是对所有问题都能得到整体最优解. 例子 从前有一只鹅, ...

  6. 会场安排问题贪心算法

    问题描述: 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场.设计一个有效的贪心算法进行安排(这个问题实际上是著名的图着色问题.若将每一个活动作为图的一个顶点,不相容活动间用边相连.使相邻 ...

  7. NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间

    会场安排问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就 ...

  8. 活动选择的贪心算法与动态规划

    问题: 有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用.每个活动a都有一个开始时间和结束时间,且 0<= s < f .一旦被选 ...

  9. 解题报告 『活动安排(贪心)』

    原题地址 第一次提交WA了两个点,因此特地写一篇博客. 错误见代码: #include <bits/stdc++.h> using namespace std; #define rep(i ...

最新文章

  1. 宽带服务价值链之:ISP,ICP,ASP,IDC,CDN
  2. 2017-2018-1 《信息安全系统设计基础》课下测试错题汇总
  3. 数据结构:堆python实现与堆排序
  4. 【剑指offer】_10二叉树和为某一路径值
  5. 随笔2010.01.25
  6. bootstrap获取弹框数据_execl基础-分类汇总与数据有效性验证
  7. DHCP中继原理与配置
  8. 大写日期转换器(大写日期转换器)
  9. ad9修改焊盘阻焊层大小
  10. UEditor百度富文本搭建时候遇到的问题
  11. 预测控制matlab程序,预测控制matlab程序
  12. 如何把m4a转换成mp3?音频格式转换步骤
  13. 路由器回执路由配置_IT菜鸟之路由器基础配置(静态、动态、默认路由)
  14. ubuntu_pip-install_WARRING:XXX is not on PATH ...
  15. html 页面 title keyworld 的 SEO优化的 基本设置格式
  16. ERP系统模块完全解析──主生产计划MPS
  17. idea试用许可证过期的问题
  18. 实词和虚词的区别(自然语言处理要用到)
  19. html 如何实现正方形的单项选择,css实现正方形
  20. 3Par 8000存储的一些命令

热门文章

  1. OpenCV序列中创建矩阵cv :: Mat的实例(附完整代码)
  2. OpenCV坎尼探测器Canny Detector的实例(附完整代码)
  3. Qt Linguist基于文本ID的翻译
  4. OpenGL SSAO屏幕空间环境光遮蔽的实例
  5. C语言const关键字与指针
  6. C语言中的变量是怎么回事?
  7. python max函数_使用'key'和lambda表达式的python max函数
  8. Hive分区、分桶操作及其比较(转自:http://blog.csdn.net/epitomizelu/article/details/41911657)
  9. CXF+JAXB处理复杂数据
  10. Java与C#平台通信 WCF CXF SOAP