UniLecs #Task. Стоимость арифметических операций

Albert Davletov
UniLecs
Published in
2 min readNov 17, 2019

Задача: определим следующую операцию: стоимость сложения двух чисел равна их сумме. Например, стоимость операции сложения числа 1 и 2 равна 3, как и их сумма. Дан набор чисел, необходимо сложить все числа с наименьшей стоимостью.

Входные данные: numbers[] — массив натуральных чисел не превосходящих 1000. Размер массива от 2 до 1000.

Вывод: наименьшую стоимость сложения всех чисел.

Пример:

Numbers[] = [ 1, 2, 3];

Output:

  • 1й способ: 1 + 2 = 3 (Cost = 3); 3 + 3 = 6 (Cost = 6); Total Cost = 9;
  • 2й способ: 1 + 3 = 4 (Cost = 4); 4 + 2 = 6 (Cost = 6); Total Cost = 10;
  • 3й способ: 2 + 3 = 5 (Cost = 5); 1 + 5 = 6 (Cost = 6); Total Cost = 11;

Min Total Cost = 9;

Разбор

Ключ к решению — это на каждом шаге складывать 2 наименьших числа. Тогда суммарная стоимость сложения всего набора чисел будет наименьшей.
Получаем следующий алгоритм:

  1. Сортируем входной набор чисел по возрастанию.
  2. Запускаем цикл по этому набору: на каждом шаге будем брать два наименьших числа (два первых элемента набора, т.к. набор отсортирован), получаем их сумму. Удаляем эти числа из входного набора.
  3. Сумму чисел добавляем в набор. Сортируем набор по возрастанию.
  4. Считаем общую стоимость операций.
  5. Выходим из цикла, когда в наборе останется один элемент. Это и будет итоговой стоимостью всех операций.

Примечание: некоторые языки программирования поддерживает такую структуру данных, как multiset — это контейнер, автоматически сортирует добавляемые элементы в порядке возрастания. Также multiset хранит повторяющееся элементы, в отличие от простого set.
Multiset позволит вам не выполнять сортировку вручную на каждом шаге цикла.

Подробнее почитать про эти структуры данных вы можете тут:
https://codelessons.ru/cplusplus/set-i-multiset-v-c-chto-eto-takoe-i-kak-s-nimi-rabotat.html

Реализация

Реализация выполнена на С++ и C#.

C++

https://gist.github.com/unilecs/1e82e3771285fb99df775ca6fec77d79

Play-test

https://repl.it/@unilecs/WoodenOutgoingExabyte

C#

https://gist.github.com/unilecs/eba30463d8e25ca1a4c240929f401287

Play-test

https://dotnetfiddle.net/hau0lo

--

--