首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 恭喜 dkfdtf 升为本版版主,特来提个问题^_^,有点复杂。 [已结贴,结贴人:cqnucsmoon]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 15:49:00 楼主
    我有个排考场的问题。假如有N个单位的考生参加考试(每个单位的考生数不等,可能1个,也可能几百个),分别在安排在M个教室里面,每个教室安排30个考生。

    现在要求:以最小拆分数单位数来安排这些考生的座位。
    解释下要求:比如某个单位有25个人,另一个单位有5个人,则将这两个单位的人放在一起,尽量不拆分(除非不得不拆分);再如有的单位有140个人,则要求把140个必须排在相邻的教室中(相邻指教室编号),占了5个教室,但最前或最后一个教室还得补10个人才行,这10个人可以多个单位组合,也可以用另外大于10人的单位放进来。

    1.拆分单位数最少;
    2.相同情况下,以单位ID小的优先。


    不知道应该怎么解?谢谢!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 16:38:261楼 得分:10
    尽量不拆分

    例:
    单位A 25人
    单位B 6人
    单位C 5人

    这样应该把单位A和单位C排在一起,符合你的条件1。

    所以,每次排时,先按单位ID排序,然后事从第一个单位排起,排到此单位最后一个考场时,人数不足,差几个人设为X,
    Select * from 表名 where 人数 <=x order by 人数 Desc,单位ID
    也就说按小于等于X降序排,相同时取最小单位ID,符合你的条件1和条件2。
    这时得到的表,取第一条记录,就是要排在第一个单位最后一个考场的单位。

    以下以此类推,循环即可。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 21:27:262楼 得分:0
    谢谢您:十豆三,我先准备些数据,测试下您的思路,然后再回来请教您。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 21:41:083楼 得分:10
    我的解题思路是:

    1. 根据中人数计算出需用教室数
    2. 将所有 >=30 的单位中人数提出,放入空闲教室,减去 30,循环直至单位人数 < 30
    3. 将剩下的按 [单位,人数] 重新排列,人数多的排在前
    4. 取 [首记录人数]+[其它记录人数] 与 30 最接近者;有空闲教室则放入其中,否则取所有教室空位数与提取的人数最接近者放入
    5. 循环 3,4 步直至所有单位剩余人数为 0

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 09:29:324楼 得分:0
    谢谢 dkfdtf :

    我会先自己做一遍,不明白的时候再来请教。

    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved