Я столкнулся с этим вопросом в тесте.Уменьшить массив, добавив элементы
Учитывая массив, уменьшите массив до одного элемента с минимальными затратами. Для уменьшения удалите два элемента из массива, добавьте эти два числа и сохраните сумму обратно в массив. Стоимость каждой операции - это сумма элементов, удаленных на этом этапе.
Пример, пусть массив со A = [1,2,3]
Затем можно удалить 1 и 2, добавить оба из них и сохранить сумму обратно в массив. Стоимость этого шага будет (1 + 2) = 3.
Так А = [3,3], стоимость = 3
На втором этапе, можно удалить оба элемента из массива и сохранить сумму снова в массиве. Стоимость этой стадии будет 3 + 3 = 6.
Таким образом, А = [6], стоимость = 6
Так общая стоимость оказывается 9 (6 + 3).
Я попробовал сортировку массива и добавление элементов от уменьшения к увеличению, но это не удается, если есть повторяющиеся элементы.
Псевдо код моего алгоритма
sort(Array)
cost = 0
for(i=0; i<Array.length - 1; i++) {
Array[i+1] = Array[i] + Array[i+1]
cost = cost + Array[i+1]
}
Алгоритм уже упоминалось выше, не работает. Я придумал возможный случай, когда он может потерпеть неудачу. Если Array = [5, 5, 5, 5], то Cost = 45, согласно приведенному выше алгоритму.
Однако, если мы суммируем первые два элемента и последние два элемента, а затем суммируем оставшиеся два элемента, тогда общая стоимость оказывается равной 40. (На первом этапе стоимость = 10 * 2 и на следующем шаге другой 20)
Что может быть эффективным алгоритмом для этого?
Я думаю, что всегда нужно добавить два самых маленьких элемента. Вы это делаете? Пожалуйста, покажите точный алгоритм, который вы используете. Когда вы добавляете сумму обратно в массив, вы кладете ее спереди, сзади или где она принадлежит w.r.t. сортировка? –
Я отредактировал вопрос. Я сохраняю сумму обратно в массив впереди (заменяя один из элементов на сумму). Я думал сохранить сумму обратно в массив в нужном месте w.r.t. сортировка будет немного трудоемкой, поскольку мне нужно сделать это после каждой замены. – AnkitAti
Возможно, вы должны держать элементы в куче или дереве двоичного поиска? Тогда это будет стоить только O (logn), чтобы каждый раз извлекать два самых маленьких элемента. –