会场安排问题急求解答

jy_mitch 2013-05-12 08:34:14
先说一下,算法新手想问题可能比较怪,为了说清楚我的想法,可能会讲得比较多,希望能有大神解答疑问。知道怎么做的直接从“3.我的思路”开始看。

1.问题描述:

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。 (这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。) 对于给定的k个待安排的活动,计算使用最少会场的时间表

Input 第一行有1 个正整数k,表示有 k个待安排的活动。接下来的k行中,每行有 2个正整数,分别表示 k个待安排的活动开始时间和结束时间。时间以0点开始的分钟计。
Output 输出最少会场数
Sample Input
5
1 23
12 28
25 35
27 80
36 50
Sample Output
3

2. 解答 http://www.cppblog.com/zhangwangcz/archive/2012/10/19/193502.html

3.我的思路:
我的想法是这样的,把每个活动看成一个整体,然后①按结束时间排序。②取出一个未被安排的活动,然后取出下一个未被安排且与上一个取出活动相容的活动。如果所有活动都安排完,则结束。如果仍有活动未安排,继续执行②。
这样结束的话,有多少组相容活动就用多少会场。
当然这个解法是错的,谁能告诉我错在哪里?
...全文
1197 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
如果算法改成按开始时间排序而不是结束时间排序木有问题了。。。。
  • 打赏
  • 举报
回复
楼主的算法的确是错的, 反例:有四个活动,开始和结束时间依次是: 活动一:1-3; 活动二:2-4; 活动三:4-5; 活动四:3-9。 按照楼主的算法应该这样安排: 会场一:活动一、活动三; 会场二:活动二; 会场三:活动四。 需要三个会场,但最佳解只需两个会场: 会场一:活动一、活动四; 会场二:活动二、活动三;
jy_mitch 2013-05-16
  • 打赏
  • 举报
回复
引用 3 楼 icessl 的回复:
楼主,你说你的算法不对,请把你的输入和输出贴出来,让我们看看
抱歉..我后来仔细地想了一想,其实思路应该是正确的,只是我程序写错了。 让我简单证明一下吧。 思路:把每个活动看成一个整体,然后①按结束时间排序。②取出一个未被安排的活动,然后取出下一个未被安排且与上一个取出活动第一个相容的活动。如果所有活动都安排完,则结束。如果仍有活动未安排,继续执行②。 这样结束的话,有多少组相容活动就用多少会场。简单来说就是一个会场一个会场安排,直到安排满所有会场。 简单的证明思路: 假设安排到第i个会场,则第 1~i-1 个会场都排好了,那么第i个会场中是否存在活动开始时间比前i-1个会场 的第一个活动的开始时间早。用反证法会发现存在矛盾。所以这个思路是正确的。 PS:要是觉得我的证明思路有问题可以说一下,让我学习学习
icessl 2013-05-14
  • 打赏
  • 举报
回复
楼主,你说你的算法不对,请把你的输入和输出贴出来,让我们看看
jy_mitch 2013-05-13
  • 打赏
  • 举报
回复
引用 1 楼 terry724 的回复:
算法导论中的问题,设start[i]是第i的活动的开始时间,end[i]是结束时间,贪心原则为对于一个待安排的会场,当前结束时间最早的一个活动一定应该是第一个被安排的
这个我明白,我就是按这个贪心原则来做的。你按照这个原则贪心取走未安排活动集合中的活动,每一次循环,未安排活动数都会减少,直到所有活动都被取走。那么循环的次数按理来说应该是最少会场数,可是我发现答案不对。
terry724 2013-05-13
  • 打赏
  • 举报
回复
算法导论中的问题,设start[i]是第i的活动的开始时间,end[i]是结束时间,贪心原则为对于一个待安排的会场,当前结束时间最早的一个活动一定应该是第一个被安排的

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧