请问一个考场排座的有关问题

请教一个考场排座的问题
现在有10个学校,每个学校的学生人数不同,进行考场排座,每个考场30人,按7,8,8,7进行排。前后左右,不是同一个学校的学生,有什么好的算法或是方法吗
------解决方案--------------------
首先要知道考场是几行几列,才能得到前后左右
------解决方案--------------------
先用随机排序把每个学校的学生顺序打乱(这很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



------解决方案--------------------
这个问题真是不错,很有意思,等晚上有时间了,研究一下。回复 LZ 
------解决方案--------------------
引用:
关键就在这里啊。每个学校的人数不定,这样到最后,人数多学校,就会省下,如果一个学校的人多,就会全省下一个学校的了


我是新手,我说下我的看法吧,如果不对还请大神指教。既然每个学校人数不一定多少,那你这个需求有可能很难完成,因为剩下的那部分人没法安排,那部分人很容易就可以打破你的这个规则,既然如此,你与其在算法或方法上纠结,还不如想办法让客户把需求放宽些
------解决方案--------------------
这道题的关键就在人数不同,这样的话排座就不能按照自然的顺序平均去排,人数多的学校就需要轮频更高一些
比如A、B、C三个学校
C学校100人,A学校和B学校是80人。
那么排座就不能是A1、B1、C1、A2、B2、C2这样的
而应该是形如A1、C1、B1、C2、A2、B2这种了
------解决方案--------------------
参考7楼,你可以先把学校的人数按从大到小排列
然后分析人数的差别,把相近人数的交叉放到一个栈里
这样最外面的应该有相同学校的但是没有关系,因为是最先排座的
生成堆栈之后,循环堆栈一个一个排座。

更进一步来说,不需要什么栈,就是每个学校一个队列,依据学校的人数算出一个轮频系数,依据这个系数进行平均化的排座
这个系数大致参照每个学校人数所占全部学校总人数的比例算出即可
------解决方案--------------------
我觉得可以参考贪心算法的思路,每次都把人数多的几个学校安排在同一个考场,比如A200,B300,C150,从中抽取部分学生之后,这三个学校的学生人数就会减少,再从其他学校中抽取人数多的学校进行类似的排列,到最后每个学校的人数都会减少到差不多,这时候还有的学生就容易排了
------解决方案--------------------
感觉这是个组合数学的问题