问题:
有这样一类问题,例如新生入学分班,现有100名新生,要分到4个班级里, 要求每个班级的学生成绩基本平均。假设新生的入学分数就是100,99,98,97,96,95,……3,2,1。分班结果如下:
0班 1班 2班 3班
100 99 98 97
93 94 95 96
92 91 90 89
85 86 87 88
……
这样分班可以尽量使四个班级的成绩平均。
也就是将新生按成绩排序后蛇形排列到四个班级中,算法如下:
private
string
GetIndex(
int
num,
int
group)
//
num 代表新生数量,group代表班级数量。
... {
string result = ""; //一个索引的字符串,每位代表一个班级。
int index = 0;//索引字符串中的一位
int steps = 1; //步长
for(int i = 0; i < num; i++)//为每个新生找班级
...{
result += index.ToString();//构造索引字符串
if(index == group - 1)//判断是否到达班级队列尾部
...{
if(steps == 1)
...{
index = group ;
}
steps = -1;//修改前进方向为"<--"
}
if(index == 0)//判断是否到达班级队列首部
...{
if(steps == -1)
...{
index = -1;
}
steps = 1;//修改前进方向为"-->"
}
index += steps;
}
return result;
}
... {
string result = ""; //一个索引的字符串,每位代表一个班级。
int index = 0;//索引字符串中的一位
int steps = 1; //步长
for(int i = 0; i < num; i++)//为每个新生找班级
...{
result += index.ToString();//构造索引字符串
if(index == group - 1)//判断是否到达班级队列尾部
...{
if(steps == 1)
...{
index = group ;
}
steps = -1;//修改前进方向为"<--"
}
if(index == 0)//判断是否到达班级队列首部
...{
if(steps == -1)
...{
index = -1;
}
steps = 1;//修改前进方向为"-->"
}
index += steps;
}
return result;
}
调用该方法 GetIndex(100,4),即100个新生分到4个班级中,得到班级队列如下
0123 3210 0123 3210 0123 3210 0123 3210 0123 ……
对应的学生队列为:
100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,……
由两个队列就能得到分班结果