我经常教授大型入门编程课程(400-600名学生),考试时我们通常需要将班级分成不同的房间,以确保每个人都有座位参加考试。
为了简化物流,我通常会按姓氏拆分班级。例如,我可能会将姓氏以A-H开头的学生送到一个房间,I-L开头的姓氏送到第二个房间,M-S 开头的姓氏发送到第三个房间,T-Z开头的姓氏送到第四个房间。这样做的挑战在于,房间的容量往往差异巨大,很难找到一种方式来使每个人都适合。
例如,假设姓氏分布(简单起见)如下所示:
- 姓氏以A开头的有25人 - 姓氏以B开头的有150人 - 姓氏以C开头的有200人 - 姓氏以D开头的有50人
假设我有三个容量分别为350、50和50的房间。一种贪心算法寻找房间分配的方法可能是按容量降序排列房间,然后尝试按该顺序填充房间。不幸的是,这并不总是奏效。在本例中,正确的选择是将姓氏A放在一个大小为50的房间中,将姓氏B - C放入容量为350的房间中,然后将姓氏D放入另一个大小为50的房间中。贪心算法会将姓氏A和B放入350人的房间中,然后无法为其他所有人找到座位。
通过尝试房间排列的所有可能的排列,然后对每个排列运行贪心算法,很容易解决此问题。这将找到一个有效的分配或报告不存在。但是,考虑到房间数量可能在10到20之间,并且检查所有排列可能不可行,我想知道是否有更有效的方法来做到这一点。
因此,问题可以简述如下:你将获得一个班级学生姓氏的频率直方图,以及房间及其容量的列表。你的目标是根据他们姓氏的首字母将学生分配到每个房间,以便每个房间被分配到连续的字母区块且不超过其容量。是否有一种有效的算法来实现这一目标,或者至少对于合理的房间大小是有效的算法?编辑:许多人问起了连续条件。规则如下:每个房间最多应被分配到一块连续字母区块,而且不能将任何一个字母分配给两个或两个以上的房间。例如,你不能将A-E、H-N和P-Z放在同一个房间中。你也不能将A-C放在一个房间中,将B-D放在另一个房间中。谢谢!
为了简化物流,我通常会按姓氏拆分班级。例如,我可能会将姓氏以A-H开头的学生送到一个房间,I-L开头的姓氏送到第二个房间,M-S 开头的姓氏发送到第三个房间,T-Z开头的姓氏送到第四个房间。这样做的挑战在于,房间的容量往往差异巨大,很难找到一种方式来使每个人都适合。
例如,假设姓氏分布(简单起见)如下所示:
- 姓氏以A开头的有25人 - 姓氏以B开头的有150人 - 姓氏以C开头的有200人 - 姓氏以D开头的有50人
假设我有三个容量分别为350、50和50的房间。一种贪心算法寻找房间分配的方法可能是按容量降序排列房间,然后尝试按该顺序填充房间。不幸的是,这并不总是奏效。在本例中,正确的选择是将姓氏A放在一个大小为50的房间中,将姓氏B - C放入容量为350的房间中,然后将姓氏D放入另一个大小为50的房间中。贪心算法会将姓氏A和B放入350人的房间中,然后无法为其他所有人找到座位。
通过尝试房间排列的所有可能的排列,然后对每个排列运行贪心算法,很容易解决此问题。这将找到一个有效的分配或报告不存在。但是,考虑到房间数量可能在10到20之间,并且检查所有排列可能不可行,我想知道是否有更有效的方法来做到这一点。
因此,问题可以简述如下:你将获得一个班级学生姓氏的频率直方图,以及房间及其容量的列表。你的目标是根据他们姓氏的首字母将学生分配到每个房间,以便每个房间被分配到连续的字母区块且不超过其容量。是否有一种有效的算法来实现这一目标,或者至少对于合理的房间大小是有效的算法?编辑:许多人问起了连续条件。规则如下:每个房间最多应被分配到一块连续字母区块,而且不能将任何一个字母分配给两个或两个以上的房间。例如,你不能将A-E、H-N和P-Z放在同一个房间中。你也不能将A-C放在一个房间中,将B-D放在另一个房间中。谢谢!