将学生添加到颜色组的算法



我正在开发一个系统,将学生添加到颜色组(红色、蓝色、绿色、黄色(中。它们需要均匀添加。以下是将学生添加到组的逻辑图

以下是我迄今为止的逻辑(纯粹基于每组学生的数量(:

var studentsByColorGroup={"GREEN":[], "BLUE":[], "RED":[], "YELLOW":[]};
var gradeCountsByColorGroup={
"GREEN" :{3:0, 4:0, 5:0, 6:0},
"BLUE"  :{3:0, 4:0, 5:0, 6:0},
"RED"   :{3:0, 4:0, 5:0, 6:0},
"YELLOW":{3:0, 4:0, 5:0, 6:0}
};
for(var student of students) {
studentsByColorGroup[student.color].push(student);
gradeCountsByColorGroup[student.color][student.grade]++;
}
var greenCount =studentsByColorGroup["GREEN" ].length;
var blueCount  =studentsByColorGroup["BLUE"  ].length;
var redCount   =studentsByColorGroup["RED"   ].length;
var yellowCount=studentsByColorGroup["YELLOW"].length;
var list={
"GREEN" :this.greenCount,
"BLUE"  :this.blueCount,
"RED"   :this.redCount,
"YELLOW":this.yellowCount
};
var keysSorted:string[]=Object.keys(list).sort((a, b) => list[a]-list[b]);
// The first element in the list of sorted keys should 
// be the color with the LEAST students in it
newStudent.color=keysSorted[0];

现在,我需要补充一部分,确保学生在成绩方面尽可能平衡。有关详细信息,请参阅图片。

你将如何改变上面的算法,以编程方式确定新学生的颜色组?

顺便说一句,对于我正在开发的系统来说,这是一个现实世界的问题(不仅仅是学生算法作业(,该系统将于下周三上线

首先,选择计数最低的元素,然后选择学生颜色计数最低的一个。一个贪婪的算法就足够了。


const groups = new Map();
// initialize your groups
map.add("red", { ... });
function findGroup(grade) {
const min = "red";
map.forEach((group, color) => {
const groupLength = length(group);
const minLength = length(min[0]);
if(groupLength < minLength) {
min = [color]
} else if(groupLength == minLength && group[grade] < map.get(min)[grade]) {
min = color;
}
});
return min;
}

要制作一个可运行的代码段,需要进行大量编辑。。。主要功能如下:

getEligibleColorsByCounts

  • 接受一个键为颜色、值为数字的对象
  • 按值对颜色排序
  • 通过从排序最低的颜色开始,然后添加具有相同值的每个附加颜色来填充数组
  • 返回颜色数组

getEligibleColorsByTotals

  • 构建键为颜色、值来自studentsByColorGroup的对象
  • 调用传入对象的getEligibleColorsByCounts
  • 返回计数全部相等的颜色数组

按等级获取易用颜色

  • 构建键为颜色且值来自gradeCountsByColorGroup的对象
  • 调用传入对象的getEligibleColorsByCounts
  • 返回计数全部相等的颜色数组

getNewStudentColorGroup

  • 调用getEligibleColorsByTotals
  • 如果只有一种可能的颜色,则返回该颜色
  • 否则调用getEligibleColorsByGrade并传入getEligible ColorsbyTotals的结果
  • 返回单一颜色

addStudent

  • 从getNewStudentColorGroup获取新生的颜色
  • 将学生添加到颜色组数组
  • 增加新学生的人数。按颜色组进行交易

var students = [];
students.push({name: "student1", grade:4});
students.push({name: "student2", grade:6});
students.push({name: "student3", grade:5});
students.push({name: "student4", grade:3});
students.push({name: "student5", grade:6});
students.push({name: "student6", grade:3});
students.push({name: "student7", grade:3});
students.push({name: "student8", grade:3});
var studentsByColorGroup = {
"GREEN": [],
"BLUE": [],
"RED": [],
"YELLOW": []
};
var gradeCountsByColorGroup = {
"GREEN": {
3: 0,
4: 0,
5: 0,
6: 0
},
"BLUE": {
3: 0,
4: 0,
5: 0,
6: 0
},
"RED": {
3: 0,
4: 0,
5: 0,
6: 0
},
"YELLOW": {
3: 0,
4: 0,
5: 0,
6: 0
}
};
var getEligibleColorsByCounts = function(counts) {
var colors = Object.keys(counts);
colors.sort(function(a, b) {
return (counts[a] - counts[b]);
});
var returnArray = [];
for (var index = 0; index < colors.length; index++) {
returnArray.push(colors[index]);
if (index != colors.length - 1) {
if (counts[colors[index]] != counts[colors[index + 1]]) {
break;
}
}
}
return (returnArray);
};
var getEligibleColorsByTotals = function() {
var colorCounts = {
"GREEN": studentsByColorGroup["GREEN"].length,
"BLUE": studentsByColorGroup["BLUE"].length,
"RED": studentsByColorGroup["RED"].length,
"YELLOW": studentsByColorGroup["YELLOW"].length
};
var returnArray = getEligibleColorsByCounts(colorCounts);
return (returnArray);
};
var getEligibleColorsByGrade = function(colors, grade) {
var colorCounts = {};
colors.forEach(function(color) {
colorCounts[color] = gradeCountsByColorGroup[color][grade];
});
var returnArray = getEligibleColorsByCounts(colorCounts);
return (returnArray);
};
var getNewStudentColorGroup = function(grade) {
var returnColor = '';
var totalsColors = getEligibleColorsByTotals();
if (totalsColors.length == 1) {
returnColor = totalsColors[0];
} else {
var gradeColors = getEligibleColorsByGrade(totalsColors, grade);
returnColor = gradeColors[0];
}
return (returnColor);
};
var addStudent = function(student, grade) {
var color = getNewStudentColorGroup(grade);
studentsByColorGroup[color].push(student);
gradeCountsByColorGroup[color][grade]++;
};
students.forEach(function(student){
addStudent(student, student.grade);
});
console.log(studentsByColorGroup);
var newStudent = {};
console.log("Adding Student9");
newStudent = {name: "student9", grade:6}; 
students.push(newStudent);
addStudent(newStudent, newStudent.grade);
console.log(studentsByColorGroup);
console.log("Adding Student10");
newStudent = {name: "student10", grade:3};
students.push(newStudent);
addStudent(newStudent, newStudent.grade);
console.log(studentsByColorGroup);
console.log("Adding Student11");
newStudent = {name: "student11", grade:4}; 
students.push(newStudent);
addStudent(newStudent, newStudent.grade);
console.log(studentsByColorGroup);
console.log("Adding Student12");
newStudent = {name: "student12", grade:6}; 
students.push(newStudent);
addStudent(newStudent, newStudent.grade);
console.log(studentsByColorGroup);
console.log("Adding Student13");
newStudent = {name: "student13", grade:5}; 
students.push(newStudent);
addStudent(newStudent, newStudent.grade);
console.log(studentsByColorGroup);

最新更新