Тема . (старое) 27. Программирование

.01 Передвижение по магистрали

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела (старое) 27. программирование
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#88162

У медицинской компании есть N пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных контейнерах, каждый из которых вмещает не более 289 штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории.

Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.

Определите, насколько изменится минимальную общая стоимость доставки биоматериалов из всех пунктов приёма в лабораторию, если сменить контейнеры на такие, что их обьем не превышает 451.

Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число            7
(1 ≤ N ≤ 10 )  – количество пунктов приёма биоматериалов. В каждой из следующих N строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает 1000).

Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой отметки.

В ответе укажите два числа через пробел: сначала значение искомой величины для файла A, затем – для файла B.

Вложения к задаче
Показать ответ и решение

Чтобы найти разницу между моделями с разными по объёму контейнерами, запустим программы сначала с k=289, а потом с k=451 и вычтем из первого результата второй. Для файла А получим: 348015 - 254631 = 93384 Для файла В получим: 339199669208 - 246528140589 = 92671528619 Эти числа и запишем в ответ.

Решение для файла A

from math import ceil

f = open(’7_27A.txt’)
# k = 289
k = 451
n = int(f.readline())

points = []
for i in f:
    dist, cnt = map(int, i.split())
    # Чтобы контейнеров точно хватило, нужно округлять в большую сторону - ceil
    points.append([dist, ceil(cnt / k)])

costs = []
for cur_d, cur_c in points:
    # Перебираем пункты, где можем поставить лабораторию
    sm = 0
    for dist, cnt in points:
        # Для пункта увеличиваем сумму - умножаем расстояние до лаборатории на количество контейнеров
        sm += abs(dist - cur_d) * cnt
    costs.append(sm)

print(min(costs))

Решение для файла B

f = open(’7_27B.txt’)
n = int(f.readline())

points = []
all_count = 0
k = 289 # Поменяем на 451 при втором запуске
for i in range(n):
    # Считываем номер пункта и количество пробирок
    num, cnt = list(map(int, f.readline().split()))
    # Считаем количество контейнеров
    if cnt % k == 0:
        cnt = cnt // k
    else:
        cnt = cnt // k + 1
    all_count += cnt
    points.append([num, cnt])

# Полная стоимость относительно пункта по индексу 0
sm = 0
for i in range(n):
    # Умножаем кол-во контейнеров пункта по индексу i на расстояние до пункта по индексу 0
    sm += (points[i][0] - points[0][0]) * points[i][1]

left_count = 0
min_cost = sm
for i in range(1, n):
    # При перемещении на пункт вправее к сумме контейнеров прошлых пункта
    # добавляется контейнеры пункта points[i - 1]
    left_count += points[i - 1][1]
    # Считаем изменение расстояния
    r = points[i][0] - points[i - 1][0]
    # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
    sm = sm + left_count * r - (all_count - left_count) * r
    min_cost = min(min_cost, sm)

print(min_cost)

Ответ: 93384 92671528619

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

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

Бесплатное онлайн-обучение

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

Налоговые вычеты

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

Специальное предложение
для учителей

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

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!