请教一个考场排座的问题

chenguang79 2014-06-12 09:12:28
现在有10个学校,每个学校的学生人数不同,进行考场排座,每个考场30人,按7,8,8,7进行排。前后左右,不是同一个学校的学生,有什么好的算法或是方法吗
...全文
4600 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
感觉这是个组合数学的问题
淡淡的活着 2014-06-13
  • 打赏
  • 举报
回复
引用 26 楼 just_for_download1 的回复:
歪个题外话: CSDN的下载分,除了上传资源给个别人下载,还有啥方法获得没?
可用分换10:1
just_for_download1 2014-06-13
  • 打赏
  • 举报
回复
引用 27 楼 lw_881020 的回复:
21楼最后排出来的队伍必须是7878的,不然左右同桌可能是同一个学校..... 必须在方法中加入一个判断,每排到能整除15的数时,换组排。比如开始从GA开始排的,这时候从GB开始排。
恩,我那里描述不够准确, 图画的是对的,是按照7887画的。自己在程序里面控制下就可以。多谢提醒。
just_for_download1 2014-06-13
  • 打赏
  • 举报
回复
引用 27 楼 lw_881020 的回复:
21楼最后排出来的队伍必须是7878的,不然左右同桌可能是同一个学校..... 必须在方法中加入一个判断,每排到能整除15的数时,换组排。比如开始从GA开始排的,这时候从GB开始排。
???
lw_881020 2014-06-13
  • 打赏
  • 举报
回复
21楼最后排出来的队伍必须是7878的,不然左右同桌可能是同一个学校..... 必须在方法中加入一个判断,每排到能整除15的数时,换组排。比如开始从GA开始排的,这时候从GB开始排。
just_for_download1 2014-06-13
  • 打赏
  • 举报
回复
歪个题外话: CSDN的下载分,除了上传资源给个别人下载,还有啥方法获得没?
changjiangzhibin 2014-06-13
  • 打赏
  • 举报
回复
21楼的Good --
於黾 2014-06-13
  • 打赏
  • 举报
回复
引用 18 楼 jiangsuwx 的回复:
应该先把学校人数最多的排好,其他学校的依次的插空进去
头像很耀眼. 21楼的方法不错.
大鹏灬 2014-06-13
  • 打赏
  • 举报
回复
继续学习中
just_for_download1 2014-06-13
  • 打赏
  • 举报
回复
当然上面有一点点细节说的不够完美: M2+M3+M4+...+M10 = MB , 设 M1 - (M2+M3+M4+....+M10 ) = N ,对于GA和GB中的前MB个学生,是轮流抽取的,剩下的N个学生,也许有小部分可以安排在前面一个教室,以为前面一个教室可能没坐满。当然这种小细节处理,也是很容易做到的。
just_for_download1 2014-06-13
  • 打赏
  • 举报
回复
楼主的这个问题有点意思,跟群里的朋友讨论了下,有很好的解决办法。

先看楼主问题,如下图所示:


解决思路:
1.对于一个考场教室而言,按照座位号的奇偶分为A,B两组,奇数号为A组,记为GA, 偶数号为B组(红色选中的),记为GB。 如下图所示:


2.假设10个学校的人数分别为M1,M2,M3...M10, 将他们按照人数递减来排序(为下文描述简单,假设他们现在已经是降序排列的了,即M1>=M2>=M3.....>=M10)。

3.将10个学校分别划分到组GA 和 组GB中,使得GA和GB两组中的总人数尽可能的接近。(网上这种算法很多)

4.假设经过步骤3之后,组GA和组GB中包含的学校分别为:
GA=M1+ M4 + M6 + M9 + M10
GB = M2+M3 +M5+M7+M8

5.在编排座位的时候,按照先从GA,再从GB,再从GA,再从GB。。。。这种轮流方式每次抽1个人的方式编排即可。


6.好了,上面就是算法的整体思路,完全可以解决楼主的问题。下面我们就来分析当学校人数分布处于临界的情况下的情景:

(1)学校人数最多的M1,也没有超过其他9个学校的人数之和,即人数最多的学校也没有超过整体的一半,即M1<=M2+M3+M4....+M10, 很显然 这种情况下,按照GA,GB分组方式, 是完全可以做到同一学校学生不相邻的;

(2)学校人数最多的M1超过整体的一半,即M1 > M2+M3+M4+...+M10 。这个时候,很明显, GA组只包含M1, GB组包含M2到M10 。 记M2+M3+M4+...+M10 = MB , 设 M1 - (M2+M3+M4+....+M10 ) = N ,即M1 - MB = N。这个时候该如何处理呢??
在编排座位的时候,还是按照轮流从GA,GB抽取的方式,那么最后GA组剩余N个学生,都是一个学校的,GB组为空。
如果N<=15 , 则将这N个学生安排在一个新的教室,只安排在奇数号座位即可,偶数号空着(GB组为空)。
如果N>15, 则将这N个学生安排在(N/15向上取整)个教室,同样,每个教室15个人,只安排在奇数号座位,偶数号空着(GB组为空)。

由此可见,即使在这些极端情况下,上面的算法模型一样能够解决问题。
md5e 2014-06-12
  • 打赏
  • 举报
回复
引用 6 楼 chenguang79 的回复:
有没有什么方法,能相对平均一点呢
那就留空咧,只不过资源分配上可能会消耗过多,只要保证在8~10的排法就可以了,所以要根据各校的人数,才能权衡用8\9\10哪个方案
chenguang79 2014-06-12
  • 打赏
  • 举报
回复
没看明白啊.........................
bwangel 2014-06-12
  • 打赏
  • 举报
回复
先用随机排序把每个学校的学生顺序打乱(这很easy)。形成10个队列。前5个学校一组,后5个学校一组。 如果学校人数不齐,就把多的那5个学校一组的分到少的那一组。前一组和后一组分到不同的考场。 然后 按7个那一列排, 分别取1,2,3,4,5 1 2队列的第一个学生。移出队列,放到座位上。 按8个那一列排,分别取 3,4,5,1,2,3,4,5队列的剩下的第一个学生。 再按8个排骨取, 1,2,3,4,5,6,7,1 再按7个排,取 2,3,4,5,1,2,3
chenguang79 2014-06-12
  • 打赏
  • 举报
回复
有没有什么方法,能相对平均一点呢
chenguang79 2014-06-12
  • 打赏
  • 举报
回复
关键就在这里啊。每个学校的人数不定,这样到最后,人数多学校,就会省下,如果一个学校的人多,就会全省下一个学校的了
md5e 2014-06-12
  • 打赏
  • 举报
回复
那第个学校的人数是多少呢? 一般按1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10来排的话是没有问题的,就是最后几个考场会因为学生人数的关系有所调整
chenguang79 2014-06-12
  • 打赏
  • 举报
回复
就是左右两列7人,中间两列8人
chenguang79 2014-06-12
  • 打赏
  • 举报
回复
就是现在中小学考试的,7,8,8,7
md5e 2014-06-12
  • 打赏
  • 举报
回复
首先要知道考场是几行几列,才能得到前后左右
加载更多回复(10)

62,251

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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