社区
数据结构与算法
帖子详情
继续一道贪心算法的问题
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)
...全文
224
15
打赏
收藏
继续一道贪心算法的问题
有N个学生,每个学生在(Si,Ei)时间段内有任务,我们想从中选K个学生,使得这K个学生可以观察其他N-K个学生的工作。例如有三个学生(1,5)(2,3)(4,6),那么就选择(1,5),可以监视(2,3) (4,6)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 题:poj 1042 钓鱼John starts at lake 1, but he can finish at any lake he wants.
王晓波-算法设计与分析(2版)
《算法设计与分析》课程教材——《王晓波-算法设计与分析(2版)》的课后习题答案,包含了课后习题的详细解答和算法说明
企业数据结构与算法面试题
精选众多IT企业软开面试题,包括数据结构与算法。 很早之前的文档了,但内容并不过时,多少年了基础的东西就是这些。
python-leetcode题解之第1007题行相等的最少多米诺旋转.zip
python python_leetcode题解之第1007题行相等的最少多米诺旋转.zip
北京大学解题报告与代码(搜索)
北京大学解题报告与代码(搜索) 内有详细的解题报告与代码,可参考,算法详尽,有的还有不同的算法, 是编程竞赛的不二参考资料
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章