求演算法,需求是這樣的:
有幾組原始使用者(組序列A),每個組的使用者數量是不定的,每個組的用員都是不重複的,每個使用者也只在一個組中出現。
現在想重新排列成新的組序列B,新的組要求:
1.組序列B的組數量是根據組序列A中群組成員數量最高的值決定的,例如A-組1中的成員數量最多,是N個,那麼組序列B的組數量就是N。
這樣也是為了避免A組的組內成員會同時出現在同一個B組中。
2.同上解釋,A的每個組的組內成員不能出現兩個人同時出現在一個B組中的情況,為了結果公平。
3.將A組的成員按照一定演算法規則進行調換,使最終B的各群組成員數量相差<=1。
程式是php,若有大神能直接提供這個函數就更棒了,多謝!
比如:function adjust_array($arrayA) {
return $arrayB;
}
回複內容:
求演算法,需求是這樣的:
有幾組原始使用者(組序列A),每個組的使用者數量是不定的,每個組的用員都是不重複的,每個使用者也只在一個組中出現。
現在想重新排列成新的組序列B,新的組要求:
1.組序列B的組數量是根據組序列A中群組成員數量最高的值決定的,例如A-組1中的成員數量最多,是N個,那麼組序列B的組數量就是N。
這樣也是為了避免A組的組內成員會同時出現在同一個B組中。
2.同上解釋,A的每個組的組內成員不能出現兩個人同時出現在一個B組中的情況,為了結果公平。
3.將A組的成員按照一定演算法規則進行調換,使最終B的各群組成員數量相差<=1。
程式是php,若有大神能直接提供這個函數就更棒了,多謝!
比如:function adjust_array($arrayA) {
return $arrayB;
}
$arrayB = [];$max = array_reduce($arrayA,function($varA,$varB){ return ($varA>count($varB))? $varA:count($varB)},0);$counter = 0;$row = 0;foreach($arrayA as $arrayBefore) { foreach($arrayBefore as $item) { if ($counter>=$max) { $counter = 0; $row++; } $arrayB[$row][$counter++] = $item; }}return $arrayB;
好像沒那麼複雜,你可以先統計出所有使用者數和組數,然後排一下就行了。例如5組34個人,那麼每組應該最少6個人,最多7個人,定義一個數組放置自由人,如果一個組超過7個人,多出來就放到free裡面,如果不足6個就從自由人裡面取出來補齊,如果最後自由人還有多餘的就再遍曆一次,放到6個人的組裡就好了。