2014-12-13 77 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