У медицинской компании есть N пунктов приёма биоматериалов на анализ.
Условие
У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах вместимостью не более 36 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.
Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию. Входные данные.
Файл AФайл BДано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число N (1 ≤ N ≤ 10 000 000) — количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000). Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.В ответе укажите два числа: сначала значение искомой величины для файла А, затем — для файла B. Пример организации исходных данных во входном файле:61 1002 2005 47 38 210 190 При таких исходных данных и вместимости транспортировочного контейнера, составляющей 96 пробирок, компании выгодно открыть лабораторию в пункте 2. В этом случае сумма транспортных затрат составит:1 · 2 + 3 · 1 + 5 · 1 + 6 · 1 + 8 · 2. Предупреждение: для обработки файла B не следует использовать переборный алгоритм, вычисляющий сумму для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго.
Ответ
Ответ и полный разбор откроются после входа
Посмотреть ответРешение по шагам
Как рассуждать
Решение. Сначала считаем общее количество пунктов. Далее построчно считаем все данные из файла в список elems, при этом сразу будем считать количество контейнеров, необходимое для перевозки пробирок в очередном пункте. Инициализируем список cost — в нём будем хранить общую сумму транспортных затрат для размещения лаборатории в каждом из пунктов.
Сначала посчитаем общую стоимость затрат для первого в списке пункта. При в переменной rightSum посчитаем общее количество контейнеров пунктов справа, которые необходимо перевезти (аналогично в переменной leftSum будем считать общее количество контейнеров пунктов слева). Заметим, что чтобы посчитать общую стоимость затрат для следующего пункта, необходимо вычесть из общей суммы затрат предыдущего пункта значение переменной rightSum, умноженное на разницу расстояний текущего пункта и предыдущего. Также к получившемуся значению необходимо прибавить значение переменной leftSum, умноженное на разницу расстояний текущего пункта и предыдущего. При этом будем обновлять переменные leftSum и rightSum, прибавляя к первой количество контейнеров в предыдущем пункте и отнимая от второй количество контейнеров в текущем пункте. Приведём решение задачи на языке Python.from math import ceil f = open("27_B.txt")n = int(f.readline())elems = []sum = 0rightSum = 0leftSum = 0for i in range(0, n): a, b = map(int, f.readline().split()) elems.append([a, ceil(b / 36)])cost = [0] * nfor i in range(1, n): cost[0] += (elems[i][0] - elems[0][0]) * elems[i][1] rightSum += elems[i][1]for i in range(1, n): leftSum += elems[i - 1][1] cost[i] = cost[i - 1] - rightSum * (elems[i][0] - elems[i - 1][0]) + leftSum * (elems[i][0] - elems[i - 1][0]) rightSum -= elems[i][1]print(min(cost)) В результате работы данного алгоритма при вводе данных из файла A ответ — 51063, из файла B —
Осталось ещё 1 шаг
Приведём решение Евгения Сахарова на языке…
Бесплатно · займёт минуту