Problem ten jest rozpuszczalny czas O (NlogN) i stały odstęp O (1) gdzie N jest ilość wież.
Musimy wykonać wieże o takiej samej wysokości, aby zbudować podłogi minimum.
Ważne Obserwacje
. Ponieważ budujemy minimalne podłogi, a nie budujemy pięter na wieżach i osiągamy jednakową wysokość, postaramy się, aby wieże o wysokości równej wysokości wieży docelowej były wykonane.
. Optymalne rozwiązanie polega na znalezieniu takich m
wieże, które mają minimalny suma wysokości difference.Let Rozwiązaniem okazać wieże posiadające następujące piętra w rosnącym:
m1 , m2 , m3 , ....... m floor
optymalne rozwiązanie ma następującą właściwość:
suma różnic jest minimalna:
(m - m1) + (m - m2) + (m - m3) + .....(m - (m-1))
bo tylko wtedy możemy powiedzieć, że musimy zbuduj minimalną liczbę pięter.
Tak więc okazało się, że musimy znaleźć zestaw m podłogi tak, że różnica ich wysokości od podłogi z maksymalną wysokością (w obrębie tych wież) wynosi minimum.
Powiedzmy, że mamy tablicę arr
o długości n, przedstawiająca liczbę pięter na każdej wieży. Najpierw mamy wieże o wysokości.
Następnie zaczynamy znajdować sumę differences
w następujący sposób. Powiedzmy, że jesteśmy w index i
w. Znajdujemy następującą kwotę:
arr[i + m - 1] - arr[i]
+
arr[i + m - 2] - arr[i]
+
arr[i + m - 3] - arr[i]
+
arr[i + m - 4] - arr[i]
.
.
.
arr[i + 1] - arr[i]
Pozwala wywołać sumę s1
.Teraz, gdy weźmiemy pod uwagę kolejny zestaw m
wież, czyli wieże z indeksów i + 1
do i + m
, nie potrzebują pętli obliczyć sumę różnic, to może być po prostu pochodzić z następujących:
(m - 1)*arr[i + m] - s1 - ((m-1)*arr[i])
Tak używając tej prostej techniki matematycznej, potrzebujemy tylko jednej pętli for tego problemu.
pseudokod dla proponowanego algorytmu jest:
Sort the array arr of n towers.
Compute the sum of differences for first set of m towers.
sum = 0
for(i = 1 to m - 1)
{
sum = sum + arr[i] - arr[0]
}
Now for the remaining set of m towers
previous_sum = sum, sum = 0, j = 1
minimum_sum = previous_sum
for(i = m to n - 1)
{
sum = (m-1)*arr[i] - previous_sum - (m - 1)*arr[j - 1]
increment j
if(sum < minimum_sum)
{
minimum_sum = sum
}
previous_sum = sum
}
The answer is minimum_sum.
"aby m podłogi miały równą wysokość" powinno być "dla m wież", czyż nie? Również "Są m wieże" powinno być "Istnieje n wież" może –
Czy możesz edytować swoje pytanie? Widzę 'k',' n', 'm' .. Który dokładnie jest? Chodzi mi o to, że mogę myśleć o tym, jak to prawdopodobnie jest ... Ale uważam to za mylące i byłoby ładniej, gdyby czytelnik nie musiał wymyślać, co prawdopodobnie oznacza ... – dingalapadum
Naprawiono pytanie. Dzięki za poprawki – crazyim5