博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
活动安排问题--贪心算法
阅读量:7119 次
发布时间:2019-06-28

本文共 2034 字,大约阅读时间需要 6 分钟。

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

  设有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 
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; } else A[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 Input121 33 40 73 815 1915 2010 158 186 125 104 142 90 Sample Output5

代码:

#include 
#include
#include
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
=a[i].e) { c++; i=j; } } printf("%d\n",c); } return 0;}
本文转自博客园xingoo的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
easyui tabs切换和单个页面手动刷新以及点击添加新的tabs
查看>>
一天4-5小时睡眠也可以高效工作
查看>>
图形化编程语言的设计
查看>>
实现一个前端路由,如何实现浏览器的前进与后退 ?
查看>>
面试题 async/await
查看>>
多线程协作wait、notify、notifyAll方法简介理解使用 多线程中篇(十四)
查看>>
Handler源码剖析
查看>>
微服务监控神器Prometheus的安装部署
查看>>
java常用多线程创建方式
查看>>
【刘文彬】【精解】EOS标准货币体系与源码实现分析
查看>>
MySQL入门系列:数据的插入、删除和更新
查看>>
小程序导出朋友圈海报详细记录
查看>>
dubbo集群之Cluster模块
查看>>
[译] SwiftUI 官方教程 (五)
查看>>
centOS7 安装Git
查看>>
css3打包后自动追加前缀插件:autoprefixer
查看>>
移动端反馈样式
查看>>
02.JVM-内存模型
查看>>
华为敏捷DevOps实践:产品经理如何开好敏捷回顾会议
查看>>
超全的设计模式简介(45种)
查看>>