社区
数据结构与算法
帖子详情
继续一道贪心算法的问题
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)
...全文
244
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)啊,不大理解大王的思想。大王再讲讲好么
鸡飞狗跳的周末
本周参加了ACM社团的Codeforces比赛,虽然只解决了
一道
题目,但在过程中学习了许多,包括
贪心算法
、图论等。同时也意识到自己的不足,如面对复杂
问题
时的恐惧心态。在后续的学习中将
继续
努力提升。
leetcode第17题(gas_station)
本文探讨了
一道
典型的算法题目——环路加油
问题
。该
问题
要求找到一条能够绕环路一圈的起始路径,并确保途中不会因燃油耗尽而无法
继续
行驶。通过采用
贪心算法
,我们能够有效地解决这个
问题
。
预备役2022.1.14学习总结7
作者今日学习英语并完成了
一道
贪心算法
题目,虽然起初不太理解,但通过请教他人最终解决了
问题
。此外,还总结了八个搜索相关的编程题目,计划在假期
继续
学习,补充相关知识点。
Codeforces Round #241 (Div. 2) B
本文介绍了
一道
关于画家按顺序作画的
问题
,通过
贪心算法
确定每幅画的完成时间。利用最大值更新策略来确保画家从上一幅画的完成时间开始
继续
作画。
Java描述 LeetCode,134. Gas Station 加油站
问题
本文介绍了
一道
关于
贪心算法
的
问题
——环形路线上的加油站。当所有加油站的汽油总量小于成本总和时,无法完成一圈旅行。通过分析,我们可以从任意一站出发,如果能到达下一站,则
继续
前行,否则更新起点。最终找到可以从某个起点出发完成一圈旅行的起点,否则返回-1。提供的代码实现了一个简单的贪心策略来解决此
问题
,时间复杂度为O(n)。
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章