Решение задачи #25. Python Яндекс CodeRun, Коммерческий калькулятор

Опубликовано: 13.12.2024, 16:17 | Автор: hdhAI

Вариант решения задачи на языке программирования Python с Яндекс CodeRun.
Категория: Алгоритмы.
Название задачи: Коммерческий калькулятор.
Сложность: Средняя.
Статус решения: "Решено".

Условие задачи:
Фирма OISAC выпустила новую версию калькулятора. Этот калькулятор берёт с пользователя деньги за совершаемые арифметические операции. Стоимость каждой операции в евро равна 5% от числа, которое является результатом операции. На этом калькуляторе требуется вычислить сумму N натуральных чисел (числа известны). Нетрудно заметить, что от того, в каком порядке мы будем складывать эти числа, иногда зависит, в какую сумму денег нам обойдётся вычисление суммы чисел (тем самым оказывается нарушен классический принцип «от перестановки мест слагаемых сумма не меняется»).

Например, пусть нам нужно сложить числа 10, 11, 12 и 13. Тогда если мы сначала сложим 10 и 11 (это обойдется нам в 1.05 €), потом результат с 12 (1.65 €), и затем с 13 (2.3 €), то всего мы заплатим 5 €, если же сначала отдельно сложить 10 и 11 (1.05 €), потом 12 и 13 (1.25 €) и, наконец, сложить между собой два полученных числа (2.3 €), то в итоге мы заплатим лишь 4.6 €. Напишите программу, которая будет определять, за какую минимальную сумму денег можно найти сумму данных N чисел.

Решение:


Python

import sys
import heapq

def main():
    """
    Читаем число N из стандартного потока ввода.
    """
    n = int(input())

    """
    Читаем N натуральных чисел из стандартного потока ввода и добавляем их в очередь с приоритетом (min-heap).
    """
    numbers = [int(x) for x in input().split()]
    heapq.heapify(numbers)

    """
    Вычисляем минимальную стоимость нахождения суммы N чисел.
    """
    total_cost = 0
    while len(numbers) > 1:
        # Берем два минимальных числа из очереди с приоритетом.
        a = heapq.heappop(numbers)
        b = heapq.heappop(numbers)

        # Складываем их и добавляем результат обратно в очередь с приоритетом.
        c = a + b
        heapq.heappush(numbers, c)

        # Вычисляем стоимость операции и добавляем ее к общей стоимости.
        cost = c * 0.05
        total_cost += cost

    """
    Выводим минимальную стоимость с двумя знаками после десятичной точки.
    """
    print(f"{total_cost:.2f}")

if __name__ == "__main__":
    main()
	

Объяснение кода


Импорт heapq и sys:
Импортируем необходимые модули. Хотя в данном случае sys не используется, он был указан в исходном коде.

Функция main():
Чтение входных данных:
n = int(input()): Считывает количество чисел.
numbers = [int(x) for x in input().split()]: Считывает числа и преобразует их в список целых чисел с помощью списочного включения.

Создание кучи:
heapq.heapify(numbers): Преобразует список numbers в кучу (min-heap). Теперь наименьший элемент всегда находится в numbers[0].

Цикл сложения:
while len(numbers) > 1:: Цикл выполняется, пока в куче больше одного элемента.
a = heapq.heappop(numbers): Извлекает наименьший элемент из кучи.
b = heapq.heappop(numbers): Извлекает следующий наименьший элемент из кучи.

c = a + b: Складывает два извлеченных числа.

heapq.heappush(numbers, c): Добавляет результат сложения c обратно в кучу, поддерживая структуру кучи.

cost = c * 0.05: Вычисляет стоимость операции.

total_cost += cost: Добавляет стоимость к общей стоимости.

Вывод результата:
print(f"{total_cost:.2f}"): Выводит итоговую стоимость с двумя знаками после запятой, используя f-строки для форматирования.

Источник решения: hdhai.com

Похожие статьи
Интересное





Warning: file_put_contents(/var/www/angella1/data/www/hdhai.com/counter/count.php): Failed to open stream: Permission denied in /var/www/angella1/data/www/hdhai.com/counter.php on line 89