2014-12-13 79 views
2

对我的项目进行全面高度概述的是将x个学生分成y个班级,同时保持每个班级的学生数量大致相等。计算可以在数组中的对象的最大数量

即如果有100名学生和5个班级(x = 100,y = 5),则每班应该有20名学生。对于这种情况,我可以使用下面的代码:

int maxNumberPerClass = x/y; 

然而,当有97名学生和5班,一个问题与上面的代码出现。是的,每个班级的学生人数都是相同的,但是有些学生不会被安置,因为需要两个大小为20的班级和三个大小为19的班级。

一个增量式的,这个问题将产生四个类尺寸20的一个阶级大小17.

int maxNumberPerClass = ceil(x/y); 

这种方法的问题是,最后的等级(在阵列中的最后一项)将始终包含学生数最少的。如果这个班级和其他班级之间的偏差只是一个学生,这不会成为问题。但在这种情况下,这是两个,这将是不公平的。

将X学生分成Y类的最佳方式是什么?

回答

3
int minNumberOfStudents = floor(x/y); 
int maxNumberOfStudents = minNumberOfStudents + 1; 
int numberOfClassesWithMaxStudents = x - (minNumberOfStudents * y);  
int numberOfClassesWithMinStudents = y - numberOfClassesWithMaxStudents; 
+0

感谢您的答复

return (remainingStudents - 1 + remainingClasses)/remainingClasses; 

把这个。我是否正确地说我会按以下方式使用你的方法:https://gist.github.com/MaxKramer/c9efd21eaff64ab0982a – 2014-12-13 16:37:10

+0

是的,你需要用'maxNumberOfStudents'和(y- numberOfClassesWithMaxStudents)'''minNumberOfStudents'' – sha 2014-12-13 16:39:42

+0

你的意思是我们不需要'floor',因为大多数语言会自动为int/int做? – sha 2014-12-13 16:48:25

2

如果没有指示您正在使用哪个类的话,没有办法做到这一点。

'增量'的用法是计算'下一个;班级人数将给予其余的学生,和其余类:

int remainingStudents = 97; 
int remainingClasses = 5; 

int nextClass = nextClassSize(remainingStudents, remainingClasses); 

其中nextClassSize(...)是这样的:在ideone here