У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах, каждый из которых вмещает не более 300 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна. При этом в пункте, в котором располагают лабораторию, количество пробирок должно быть больше 900.
Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.
Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).
Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.
В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.
# Файлик A
from math import ceil
f = open(’6_27A.txt’)
k = 300
m = 900
n = int(f.readline())
points = []
for i in f:
dist, cnt = map(int, i.split())
points.append([dist, cnt])
costs = []
for cur_d, cur_c in points:
# Перебираем пункты, где можем поставить лабораторию
sm = 0
for dist, cnt in points:
# Для пункта увеличиваем сумму - умножаем расстояние до лаборатории на количество контейнеров
# Чтобы контейнеров точно хватило, нужно округлять в большую сторону - ceil
sm += abs(dist - cur_d) * ceil(cnt / k)
if cur_c > m:
costs.append(sm)
print(min(costs))
# Файлик B
from math import ceil
f = open(’6_27B.txt’)
k = 300
m = 900
n = int(f.readline())
# Список, в котором индекс - расстояние от нулевой отметки до этого пункта
# элементы - количества контейнеров
# Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет
# влиять на сумму
points = [0] * 10 ** 7
# Индексы первого и последнего реального пункта
start = 10 ** 10
end = -1
for i in range(n):
# Считываем номер пункта и количество пробирок
num, cnt = map(int, f.readline().split())
# Вставляем на нужную отметку кол-во пробирок
points[num] = cnt
# Определяем крайние пункты
if cnt > 0:
start = min(start, num)
end = max(end, num)
# Удаляем нулевые пункты по краям
points = points[start: end + 1]
# Изначальная сумма для 0-го пункта
sm = 0
for i in range(len(points)):
# Умножаем кол-во контейнеров на расстояние до 0-го пункта
sm += ceil(points[i] / k) * i
# Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1,
# значит общая сумма увеличится на сумму пунктов слева
# Расстояние до всех пунктов справа уменьшится на 1,
# значит общая сумма уменьшится на сумму пунктов справа
# Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо
left = 0
# Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо
right = sum([ceil(i / k) for i in points])
current_cost = sm
# Список сумм для каждого пункта
costs = [sm]
for i in range(1, len(points)):
# При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент,
# а к левой этот элемент прибавляется
left += ceil(points[i - 1] / k)
right -= ceil(points[i - 1] / k)
# Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
current_cost = current_cost + left - right
if points[i] > m:
costs.append(current_cost)
print(min(costs))