.01 Передвижение по магистрали
Ошибка.
Попробуйте повторить позже
У медицинской компании есть пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль
автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно
количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных
транспортировочных контейнерах вместимостью
пробирок. Каждый транспортировочный контейнер упаковывается в
пункте приёма и вскрывается только в лаборатории. Компания планирует открыть лабораторию в одном из пунктов.
Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров
с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию.
Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки
биоматериалов из всех пунктов минимальна. Определите минимальную общую стоимость доставки биоматериалов из всех
пунктов приёма в лабораторию.
Входные данные:
Даны два входных файла — и
, каждый из которых содержит в первой строке число
(
) –
количество пунктов приёма биоматериалов, и число
(
) – вместимость транспортировочного контейнера.
Каждая из следующих
строк содержит два натуральных числа: номер пункта и количество пробирок (не превышающее
10000). Пункты перечислены в произвольном порядке.
Пример входного файла:
6 96
5 4
7 3
1 100
10 190
2 200
8 2
При таких исходных данных (вместимость транспортировочного контейнера равна 96 пробирок) компании выгодно
открыть лабораторию в пункте 2. В том случае сумма транспортных затрат составит .
Ответ: 32.
Неэффективное решение
f = open(’27_A.txt’) n, v = map(int, f.readline().split()) a = [] for i in range(n): s, k = map(int, f.readline().split()) # кол-во сумок if k % v == 0: c = k//v else: c = k//v + 1 a.append([s, c]) a.sort() min_sum = 10**20 for i in range(n): new_sum = 0 for j in range(n): new_sum += abs(a[i][0]-a[j][0])*a[j][1] min_sum = min(min_sum, new_sum) print(min_sum)
Эффективное решение
f = open(’27_B.txt’) n, v = map(int, f.readline().split()) a = [] for i in range(n): s, k = map(int, f.readline().split()) # Считаем кол-во контейнеров if k % v == 0: c = k // v else: c = k // v + 1 a.append([s, c]) a.sort() # Стоимость доставки в нулевом пункте s = 0 for j in range(n): s += abs(a[0][0] - a[j][0]) * a[j][1] min_sum = s left_sum = a[0][1] # Сумма пунктов слева, расстояние до которых увеличивается right_sum = sum([x[1] for x in a]) - left_sum # Сумма пунктов справа, расстояние до которых уменьшается for i in range(1, n): diff = a[i][0] - a[i - 1][0] # Расстояние между двумя пунктами # Пересчет суммы: # для предыдущих пунктов дороже, для следующих дешевле s = s + diff * left_sum - diff * right_sum # Пересчет минимума min_sum = min(min_sum, s) left_sum += a[i][1] right_sum -= a[i][1] print(min_sum)
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!