社区
数据结构与算法
帖子详情
继续一道贪心算法的问题
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)
...全文
228
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-20题)1”中,我们关注的是“poj 1042 钓鱼”
问题
,这是
一道
典型的
贪心算法
应用实例。该
问题
的背景是John计划去钓鱼,他有h小时的时间(1 ),并且有n个湖泊(2 )可以通过单向道路相连。...
王晓波-算法设计与分析(2版)
贪心算法
在每一步选择局部最优解,期望得到全局最优解,例如霍夫曼编码。回溯法则是在搜索树中进行深度优先搜索,遇到无法
继续
的情况时回退,常用于求解组合优化
问题
,如八皇后
问题
。近似算法在无法找到精确解时,...
企业数据结构与算法面试题
以上
问题
体现了数据结构(如栈、队列、树、链表、数组)和算法(如搜索、排序、动态规划、贪心策略)在实际
问题
中的应用。理解和熟练掌握这些基础知识对于面试和实际工作都至关重要。在准备面试时,不仅要注意理论...
python-leetcode题解之第1007题行相等的最少多米诺旋转.zip
Python以其简洁的语法和强大的库支持,在解决算法
问题
时能够提供清晰和高效的代码实现。在编写代码之前,我们需要先对
问题
进行分析,理解多米诺骨牌排列的规则,以及如何表示和操作这些规则。 第1007题通常可以转化...
t3题解1
标题 "t3题解1" 描述的是
一道
与动态规划(DP)和
贪心算法
相关的编程题目。这道题目来源于洛谷平台上的P1684
问题
,并且提出了一种使用贪心策略来解决的方法,尽管不确定是否为官方认可的正解。以下是基于题目描述的详细...
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章