$length = length($array);
sort($array); //sorts the list in ascending order
$differences = ($array << 1) - $array; //gets the difference between each value and the next largest value
sort($differences); //sorts the list in ascending order
$max = ($array[$length-1]-$array[0])/$M; //this is the theoretical max of how large the result can be
$result = array();
for ($i = 0; i < $length-1; $i++){
$count += $differences[i];
if ($length-$i == $M - 1 || $count >= $max){ //if there are either no more coins that can be taken or we have gone above or equal to the theoretical max, add a point
$result.push_back($count);
$count = 0;
$M--;
}
}
return min($result)
對於非代碼的人:列表排序,發現每2個連續的元素之間的差異,那種名單(按升序排列),然後依次通過它總結了連續的值,直到您通過理論最大值或沒有足夠的元素剩餘;然後將該值添加到新數組並繼續,直到達到數組的末尾。然後返回新創建的數組的最小值。
雖然這只是一個快速草案。乍一看,這裏的任何操作都可以在線性時間內進行(基數排序)。
例如,1,4,7,100,200和M = 3,我們得到:
$differences = 3, 3, 93, 100
$max = (200-1)/3 ~ 67
then we loop:
$count = 3, 3+3=6, 6+93=99 > 67 so we push 99
$count = 100 > 67 so we push 100
min(99,100) = 99
這是一個簡單的練習,將其轉換爲一組的解決方案,我離開了閱讀器(PS在閱讀完所有的書後,我一直想說:P)
這是一個聰明的解決方案。我不能確定它是否萬無一失,但它對我的一些測試用例很有用。 – citysushi
實際上,我很確定這確實有效 – citysushi
我們如何找到實際的子集?我們得到了X [N] [i]中該子集的最大距離b/w元素,其中i是子集的大小? –