社区
数据结构与算法
帖子详情
继续一道贪心算法的问题
ksharp2008
2008-03-25 08:09:35
有N个学生,每个学生在(Si,Ei)时间段内有任务,我们想从中选K个学生,使得这K个学生可以观察其他N-K个学生的工作。例如有三个学生(1,5)(2,3)(4,6),那么就选择(1,5),可以监视(2,3) (4,6)
...全文
216
15
打赏
收藏
继续一道贪心算法的问题
有N个学生,每个学生在(Si,Ei)时间段内有任务,我们想从中选K个学生,使得这K个学生可以观察其他N-K个学生的工作。例如有三个学生(1,5)(2,3)(4,6),那么就选择(1,5),可以监视(2,3) (4,6)
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
大王派我去巡山
2008-03-27
打赏
举报
回复
这么一来应该是没问题了,贪心算法的正确性证明:
还是按照每个学生的任务结束时间升序排列:S={1,2,3,...,n}
假设用这种贪心算法得到的监视学生为i[1],i[2],...,i[k],这里1<=i[1]<i[2]<……<i[k]<=n
1.第一步,先来证明总存在一个以i[1]开头的最优解.
假设A为S的一个子集,同时A是一个最优解,假设A={j[1],j[2],...,j[t]},这里1<=j[1]<j[2]<……<j[t]<=n
首先必须满足j[1]<=i[1]。否则的话,根据贪心算法过程就可以推断出来,学生1没有被监视到。
如果i[1]==j[1],那么一切好说;
如果i[1]>j[1],就在集合A中把j[1]替换成i[1]。
凡是m<=i[1],学生m都能被学生i[1]监视到。又因为i[1]的结束时间大于m的结束时间,所以凡是m能监视到的学生,i[1]都能监视到(分m与1相交和不相交两种情况来讨论比较容易理解)。也就是说j[1]能干的活,i[1]都能包了,因此用i[1]来替换j[1]还是能监视其余所有的学生。
因此A-{j[1]}+{i[1]}仍然是一个最优解。
【实际上这里还有一个小问题要澄清,那就是j[2],...j[t]中会不会出现与i[1]重复的值?答案是不会的。
因为前面已经提到了凡是m<=i[1],m能监视的学生i[1]都能监视到,因此我们担心的情况与A是最优解相矛盾,不会出现】
2.第二步,来证明A-{i[1]}=={j[2],...,j[t]}就是“i[1]无法监视到的学生”的一个最优解。
这一步用反证法来说明:如果存在一个比集合A-{i[1]}更少的方案就能监视到所有“i[1]无法监视到的学生”,那么这个方案再加上i[1],就能监视到所有的学生,这与A是最优解是矛盾的.
以上2步合起来就能说明,每进行一次贪心选择就可以得到一个最优解。
tailzhou
2008-03-27
打赏
举报
回复
1)对结束时间最早的学生a1,求跟其有时间交叉,且结束时间最大的学生aj;
2)对aj无法监视的学生中结束时间最早的学生a1' ,求跟其有时间交叉,且结束时间最大的学生aj';
直到所有学生都被监视或选中,否则继续2);
tailzhou
2008-03-27
打赏
举报
回复
确实有问题;
“剔除aj能监视到的学生”
修改为:
“剔除结束时间早于aj的结束时间的学生,也就是在j之后的学生继续第一步;”
大王派我去巡山
2008-03-27
打赏
举报
回复
欢迎楼上破处。
感觉tailzhou的方法有问题,举个反例:
(1,3)、(4,5)、(6,7)、(2,10)、(8,11)、(12,13)、(14,15)、(9,16)
很明显,(2,10)和(9,16)就能监视其它的所有学生。
如果按照你的方法,出来的结果会是(2,10)、(12,13)、(14,15)
“剔除aj能监视到的学生”,这里太粗暴了。
hogfish
2008-03-27
打赏
举报
回复
处女贴
大王派我去巡山
2008-03-26
打赏
举报
回复
没有其它要求吗?
从你的描述来看,似乎是任务时间上有重叠的学生就可以互相监视。
那么又成了一个典型的“会场分配/活动选择”问题:根据贪心算法找出最多的不相交时间段,这就是那K个学生。
这个题如果是求最小的K,和你前面那个问题就是一回事了。
tailzhou
2008-03-26
打赏
举报
回复
按照结束时间排序;
1)对结束时间最早的学生a1,求跟其有时间交叉,且结束时间最大的学生aj,提出aj能监视到的学生;
2)在剩下的学生中继续1),直到没剩下任何学生;
证明:
a1要么被选中,要么被选中的某个学生监视;,
1)如果a1被中,那么a1能监视到跟a1有交叉的学生;
2)如果a1没被选中,那么必定选中跟a1有交叉的学生之一;由于,a1是结束时间最早的学生,所以所有跟a1有交叉的学生的时间段必定包含有a1的结束时间;所以选其中的任何一个都可以监视到所有跟跟a1有交叉的学生;且被选中的学生能监视到开始时间早于其结束时间的所有学生;而aj是跟a1有交叉的学生中结束时间最晚的,所以aj能监视到所有开始时间早于aj的结束时间的所有学生;
证毕!
ksharp2008
2008-03-26
打赏
举报
回复
在贪心算法的那张出现的啊,是贪心吧
ksharp2008
2008-03-26
打赏
举报
回复
mathe也来了啊,看了mathe的很多帖子了,高人啊。顺便问句问什么老外的离散数学那么的厚啊,国内作者薄薄的离散数学写的好么?想学习,感觉太厚了,题做不完啊
ksharp2008
2008-03-26
打赏
举报
回复
也有可能最优啊,如最小生成树,最短路径,最大相容任务等等。我再想想贪心能搞出最优的不,动态规划的效率我觉得不如贪心高啊。才学算法,在下的愚见,不对别见笑,呵呵
shark003
2008-03-26
打赏
举报
回复
不是贪心,是DP吧.
mathe
2008-03-26
打赏
举报
回复
贪心算法得出结果不一定最优的吧。
你贴出的两道题目怎么看都应该用DP来求最优解。
ksharp2008
2008-03-26
打赏
举报
回复
恩,是选一个最小的K,这些K是当干部的,所以要少。呵呵
大王派我去巡山
2008-03-26
打赏
举报
回复
(1,5)可以监视(2,3)(4,6),
(2,3)(4,6)也可以监视(1,5),
这两种方案都能满足监视要求。
原题中要求一定是最小的k吗?
ksharp2008
2008-03-26
打赏
举报
回复
(1,5)(2,3)(4,6)前边我说的那题以前没说明白,是找最小时间段集合,既集合中包含的时间段最小。那么前题的答案是(2,3)(4,4)既(2,4)。放到这题就该是(1,5)。但大王所说的根据贪心算法找出最多的不相交时间段,这就是那K个学生应该为(2,3)(4,6)啊,不大理解大王的思想。大王再讲讲好么
算法实验(贪心策略 17-20题)1
在“算法实验(贪心策略 17-20题)1”中,我们关注的是“poj 1042 钓鱼”
问题
,这是
一道
典型的
贪心算法
应用实例。该
问题
的背景是John计划去钓鱼,他有h小时的时间(1 ),并且有n个湖泊(2 )可以通过单向道路相连。...
王晓波-算法设计与分析(2版)
贪心算法
在每一步选择局部最优解,期望得到全局最优解,例如霍夫曼编码。回溯法则是在搜索树中进行深度优先搜索,遇到无法
继续
的情况时回退,常用于求解组合优化
问题
,如八皇后
问题
。近似算法在无法找到精确解时,...
企业数据结构与算法面试题
以上
问题
体现了数据结构(如栈、队列、树、链表、数组)和算法(如搜索、排序、动态规划、贪心策略)在实际
问题
中的应用。理解和熟练掌握这些基础知识对于面试和实际工作都至关重要。在准备面试时,不仅要注意理论...
python-leetcode题解之第1007题行相等的最少多米诺旋转.zip
Python以其简洁的语法和强大的库支持,在解决算法
问题
时能够提供清晰和高效的代码实现。在编写代码之前,我们需要先对
问题
进行分析,理解多米诺骨牌排列的规则,以及如何表示和操作这些规则。 第1007题通常可以转化...
算法-多米诺骨牌(洛谷-P1282)(包含源程序).rar
标题中的“多米诺骨牌”是
一道
经典的算法
问题
,源自洛谷平台的P1282题目。这个
问题
通常涉及到编程思维、数组处理和逻辑推理。在这个
问题
中,你可能会遇到如何有效地放置多米诺骨牌,使得每对相邻的骨牌都能够立起来...
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章