Тема 27. Программирование

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

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

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

Задача 1#37645

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

Входные данные:

Даны два входных файла — A  и B  , каждый из которых содержит в первой строке число N  (1 ≤ N ≤ 10000000  ) – количество пунктов приёма биоматериалов, и число V  (1 ≤ V ≤ 1000  ) – вместимость транспортировочного контейнера. Каждая из следующих N  строк содержит два натуральных числа: номер пункта и количество пробирок (не превышающее 10000). Пункты перечислены в произвольном порядке.

Пример входного файла:

6 96

5 4

7 3

1 100

10 190

2 200

8 2

При таких исходных данных (вместимость транспортировочного контейнера равна 96 пробирок) компании выгодно открыть лабораторию в пункте 2. В том случае сумма транспортных затрат составит 1⋅2+ 3 ⋅1+ 5⋅1 + 6⋅1+ 8 ⋅2 = 32  . Ответ: 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)

Ответ: 128822 6201378713

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

Задача 2#61643

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

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

Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.

Входные данные

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

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

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

Типовой пример организации данных во входном файле

6

1 100

2 200

5 4

7 3

8 2

10 190

При таких исходных данных и вместимости транспортировочного контейнера, составляющей 96 пробирок, компании выгодно открыть лабораторию в пункте 2. В этом случае сумма транспортных затрат составит:1 ⋅2+ 3⋅1 + 5⋅1+ 6⋅1 + 8⋅2  .

Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемых файлов.

Предупреждение: для обработки файла B не следует использовать переборный алгоритм, вычисляющий сумму для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго.

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

Решение А

f = open(’27A__1udcp.txt’)
n = int(f.readline())
a = []
for i in range(n):
    km, prob = map(int,f.readline().split())#считываем количество километров и количество пробирок
    count_conteiner = prob//26 if prob % 26 == 0 else prob//26 + 1 #выделяем количество контейнеров,
    # если количество пробирок не делится нацело на 26, то берем один контейнер дополнительно
    a += [[km,count_conteiner]]#добавляем эти данные в список

mn = float(’inf’)
for i in range(n):# i индекс - место лаборатории
    s = 0
    for j in range(n):# j индекс - место пункта
        s += abs(a[i][0]-a[j][0])*a[j][1]#расстояние считается как произведение расстояния между пунктами на количество пробирок в пункте
    mn = min(mn,s)
print(mn)

Решение Б

f = open(’27B__1udcq.txt’)
n = int(f.readline())
a = []
sm = 0#суммарное кол-во контейнеров
for i in range(n):
    km, prob = map(int,f.readline().split())#считываем количество километров и количество пробирок
    count_conteiner = prob//26 if prob % 26 == 0 else prob//26 + 1 #выделяем количество контейнеров,
    # если количество пробирок не делится нацело на 26, то берем один контейнер дополнительно
    sm += count_conteiner
    a += [[km,count_conteiner]]#добавляем эти данные в список

s = 0
for i in range(n):# в данном цикле высчитывается стоимость для лаборатории, котора стоит на 0 индексе
    s += (a[i][0]-a[0][0]) * a[i][1]
mn = s
expsv = 0# число контейнеров, для которых стоимость вырастет

for i in range(1,n):
    expsv += a[i-1][1]#высчитываем кол-во контейнеров, для которых стоимость вырастет при смене места лаборатории
    r = a[i][0] - a[i-1][0]# разность в км между двумя соседними пунктами
    s = s + r*expsv - r*(sm - expsv)# формируем стоимость для лаборатории стоящей, на i-ом индексе.
    # На r*expsv станет дороже стоимость, поскольку относительно магистрали мы сдвинули лабораторию правее и всё, что было левее - стало дороже,
    # но всё, что было правее лаборатории стало дешевле на r*(sm - expsv)
    mn = min(mn,s)
print(mn)

Ответ: 21059 2956646501958

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

Задача 3#82951

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

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

Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27B.txt’) # Открываем нужный файл
n = int(f.readline())

points = []
all_count = 0
for i in range(n):
    # Считываем номер пункта и количество пробирок
    num, cnt = list(map(int, f.readline().split()))
    # Считаем количество контейнеров
    cnt = (cnt // 41) + int(cnt % 41 != 0)
    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)

Ответ: 19145 1905003873009

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

Задача 4#82952

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
# Функция для вычисления количества контейнеров в пункте
# Если кол-во пробирок не делится нацело - нужно взять ещё один контейнер
def count(x, k):
    return x // k + int(x % k != 0)


f = open(’27B_16_02.txt’)
k = 73
n = int(f.readline())

# Список, в котором индекс - расстояние от нулевой отметки до этого пункта
# элементы - количества контейнеров
# Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет
# влиять на сумму

points = [0] * 10 ** 7

# Индексы первого и последнего реального пункта
start = 10 ** 10
end = -1

for i in range(n):
    # Считываем номер пункта и количество пробирок
    num, cnt = list(map(int, f.readline().split()))
    # Вставляем на нужную отметку кол-во контейнеров
    points[num] = count(cnt, k)
    # Определяем крайние пункты
    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 += points[i] * i

# Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1,
                                                                                                  
                                                                                                  
# значит общая сумма увеличится на сумму пунктов слева

# Расстояние до всех пунктов справа уменьшится на 1,
# значит общая сумма уменьшится на сумму пунктов справа

# Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо
left = 0
# Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо
right = sum(points)

current_cost = sm
# Список сумм для каждого пункта
costs = []
if points[0] > 0:
    costs.append(sm)

for i in range(1, len(points)):
    # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент,
    # а к левой этот элемент прибавляется
    left += points[i - 1]
    right -= points[i - 1]
    # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
    current_cost = current_cost + left - right
    if points[i] > 0:
        costs.append(current_cost)

print(max(costs) - min(costs))

Ответ: 8566 1106413778010

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

Задача 5#82953

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

Благодаря развитию нанотехнологий и изобретению телепортов компания, расположив в каждом пункте по одному устройству телепортации, может отправлять некоторое количество пробирок напрямую в лабораторию абсолютно бесплатно. Но так как телепортация - новая технология, пока что ещё запускать телепорты можно только раз в день, и перемещать они могут только простое число пробирок.

Поэтому компания решила телепортировать из каждого пункта максимально возможное число пробирок, а остальные поштучно доставлять в лабораторию по автомагистрали.

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

Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.

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

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

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

Вложения к задаче
Показать ответ и решение
# Функция для определения простых чисел
def simple(x):
    if x <= 1:
        return False
    for i in range(2, int(x ** 0.5) + 1):
        if x % i == 0:
            return False
    return True


# Нахождение всех простых чисел до 1000,
# так как количество пробирок не превышает это число
nums = [0]
for i in range(1000):
    if simple(i):
        nums.append(i)


# Поиск максимального простого числа, которое можно забрать из пробирок
def count(x):
    return x - max(i for i in nums if i <= x)


f = open(’27B_16_03.txt’)
n = int(f.readline())

# Список, в котором индекс - расстояние от нулевой отметки до этого пункта
# элементы - количества контейнеров
# Если на какой-то отметке пункта нет, там останется 0, и этот пункт не будет
# влиять на сумму

points = [0] * 10 ** 7

# Индексы первого и последнего реального пункта
start = 10 ** 10
end = -1

for i in range(n):
    # Считываем номер пункта и количество пробирок
    num, cnt = list(map(int, f.readline().split()))
    # Вставляем на нужную отметку кол-во контейнеров
    points[num] = count(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 += points[i] * i

# Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1,
# значит общая сумма увеличится на сумму пунктов слева

# Расстояние до всех пунктов справа уменьшится на 1,
# значит общая сумма уменьшится на сумму пунктов справа

# Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо
left = 0
# Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо
right = sum(points)

current_cost = sm
# Список сумм для каждого пункта
costs = []
if points[0] > 0:
costs.append(sm)

for i in range(1, len(points)):
    # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент,
    # а к левой этот элемент прибавляется
    left += points[i - 1]
    right -= points[i - 1]
    # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
    current_cost = current_cost + left - right
    if points[i] > 0:
     costs.append(current_cost)

print(min(costs))



Ответ: 5099 527929859341

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

Задача 6#88156

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

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

Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.

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

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

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

Вложения к задаче
Показать ответ и решение
# Файлик A
from math import ceil

f = open(’1_27A.txt’)
k = 38
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
from math import ceil

f = open(’1_27B.txt’)
k = 38
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] = ceil(cnt / k)
    # Определяем крайние пункты
    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 += points[i] * i

# Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1,
# значит общая сумма увеличится на сумму пунктов слева

# Расстояние до всех пунктов справа уменьшится на 1,
# значит общая сумма уменьшится на сумму пунктов справа

# Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо
left = 0
# Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо
right = sum(points)

current_cost = sm
# Список сумм для каждого пункта
costs = [sm]

for i in range(1, len(points)):
    # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент,
    # а к левой этот элемент прибавляется
    left += points[i - 1]
    right -= points[i - 1]
    # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
    current_cost = current_cost + left - right
    if points[i] > 0:
        costs.append(current_cost)

print(min(costs))
                                                                                                  
                                                                                                  

Ответ: 2064099 2047975715381

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

Задача 7#88157

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
# Файлик A
from math import ceil

f = open(’2_27A.txt’)
k = 500
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(max(costs))


# Файлик B
from math import ceil

f = open(’2_27B.txt’)
k = 500
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] = ceil(cnt / k)
    # Определяем крайние пункты
    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 += points[i] * i

# Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1,
# значит общая сумма увеличится на сумму пунктов слева

# Расстояние до всех пунктов справа уменьшится на 1,
# значит общая сумма уменьшится на сумму пунктов справа

# Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо
left = 0
# Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо
right = sum(points)

current_cost = sm
# Список сумм для каждого пункта
costs = [sm]

for i in range(1, len(points)):
    # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент,
    # а к левой этот элемент прибавляется
    left += points[i - 1]
    right -= points[i - 1]
    # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
    current_cost = current_cost + left - right
    if points[i] > 0:
        costs.append(current_cost)

print(max(costs))
                                                                                                  
                                                                                                  

Ответ: 437253 449804330401

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

Задача 8#88158

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

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

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

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

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

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

Вложения к задаче
Показать ответ и решение
# Файлик A
from math import ceil

f = open(’3_27A.txt’)
k = 111
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(max(costs) - min(costs))


# Файлик B
from math import ceil

f = open(’3_27B.txt’)
k = 111
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] = ceil(cnt / k)
    # Определяем крайние пункты
    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 += points[i] * i

# Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1,
# значит общая сумма увеличится на сумму пунктов слева

# Расстояние до всех пунктов справа уменьшится на 1,
# значит общая сумма уменьшится на сумму пунктов справа

# Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо
left = 0
# Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо
right = sum(points)

current_cost = sm
# Список сумм для каждого пункта
costs = [sm]

for i in range(1, len(points)):
    # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент,
    # а к левой этот элемент прибавляется
    left += points[i - 1]
    right -= points[i - 1]
    # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
    current_cost = current_cost + left - right
    if points[i] > 0:
        costs.append(current_cost)

print(max(costs) - min(costs))
                                                                                                  
                                                                                                  

Ответ: 815903 752430057114

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

Задача 9#88159

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

Благодаря развитию нанотехнологий и изобретению телепортов компания, расположив в каждом пункте по одному устройству телепортации, может отправлять некоторое количество пробирок напрямую в лабораторию абсолютно бесплатно. Но так как телепортация - новая технология, пока что ещё запускать телепорты можно только раз в день, и перемещать они могут только число пробирок, являющееся членами последовательности Фибоначчи.

Поэтому компания решила телепортировать из каждого пункта максимально возможное число пробирок, а остальные поштучно доставлять в лабораторию по автомагистрали.

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

Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.

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

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

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

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

# Функция, которая вычитает максимальное подходящее число фибоначчи из числа пробирок
def fib(x):
    mx = max([i for i in fibs if x >= i])
    return x - mx

# Сначала необходимо сгенерировать числа фибоначчи до 1000
fibs = [0, 1, 1]
while fibs[-1] <= 1000:
    fibs.append(fibs[-2] + fibs[-1])

f = open(’4_27A.txt’)
n = int(f.readline())

points = []
for i in f:
    dist, cnt = map(int, i.split())
    # С поиощью нашей функции fib находим остаток нетелепортированных пробирок
    points.append([dist, fib(cnt)])

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

# Функция, которая вычитает максимальное подходящее число фибоначчи из числа пробирок
def fib(x):
    mx = max([i for i in fibs if x >= i])
    return x - mx

# Сначала необходимо сгенерировать числа фибоначчи до 1000
fibs = [0, 1, 1]
while fibs[-1] <= 1000:
                                                                                                  
                                                                                                  
    fibs.append(fibs[-2] + fibs[-1])

f = open(’4_27B.txt’)
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())
    # Вставляем на нужную отметку кол-во контейнеров
    # С поиощью нашей функции fib находим остаток нетелепортированных пробирок
    points[num] = fib(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 += points[i] * i

# Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1,
# значит общая сумма увеличится на сумму пунктов слева

# Расстояние до всех пунктов справа уменьшится на 1,
# значит общая сумма уменьшится на сумму пунктов справа

# Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо
left = 0
# Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо
                                                                                                  
                                                                                                  
right = sum(points)

current_cost = sm
# Список сумм для каждого пункта
costs = [sm]

for i in range(1, len(points)):
    # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент,
    # а к левой этот элемент прибавляется
    left += points[i - 1]
    right -= points[i - 1]
    # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
    current_cost = current_cost + left - right
    if points[i] > 0:
        costs.append(current_cost)

print(min(costs))

Ответ: 17042792 17209100128563

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

Задача 10#88160

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

Благодаря развитию нанотехнологий и изобретению телепортов компания, расположив в каждом пункте по одному устройству телепортации, может отправлять некоторое количество пробирок напрямую в лабораторию абсолютно бесплатно. Но так как телепортация - новая технология, пока что ещё запускать телепорты можно только раз в день, и перемещать они могут только число пробирок, являющееся факториалами натуральных чисел.

Поэтому компания решила телепортировать из каждого пункта максимально возможное число пробирок, а остальные поштучно доставлять в лабораторию по автомагистрали.

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

Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.

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

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

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

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

# Функция, которая вычитает максимальный подходящий факториал из числа пробирок
def fact(x):
    mx = max([i for i in facts if x >= i])
    return x - mx


# Сначала необходимо сгенерировать факториалы до 1000
facts = [0, 1]
k = 2
while facts[-1] <= 1000:
    facts.append(facts[-1] * k)
    k += 1

f = open(’5_27A.txt’)
n = int(f.readline())

points = []
for i in f:
    dist, cnt = map(int, i.split())
    # С поиощью нашей функции fib находим остаток нетелепортированных пробирок
    points.append([dist, fact(cnt)])

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

# Функция, которая вычитает максимальный подходящий факториал из числа пробирок
def fact(x):
    mx = max([i for i in facts if x >= i])
    return x - mx

                                                                                                  
                                                                                                  

# Сначала необходимо сгенерировать факториалы до 1000
facts = [0, 1]
k = 2
while facts[-1] <= 1000:
    facts.append(facts[-1] * k)
    k += 1

f = open(’5_27B.txt’)
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())
    # Вставляем на нужную отметку кол-во контейнеров
    # С поиощью нашей функции fib находим остаток нетелепортированных пробирок
    points[num] = fact(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 += points[i] * i

# Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1,
# значит общая сумма увеличится на сумму пунктов слева

                                                                                                  
                                                                                                  
# Расстояние до всех пунктов справа уменьшится на 1,
# значит общая сумма уменьшится на сумму пунктов справа

# Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо
left = 0
# Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо
right = sum(points)

current_cost = sm
# Список сумм для каждого пункта
costs = [sm]

for i in range(1, len(points)):
    # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент,
    # а к левой этот элемент прибавляется
    left += points[i - 1]
    right -= points[i - 1]
    # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
    current_cost = current_cost + left - right
    if points[i] > 0:
        costs.append(current_cost)

print(min(costs))

Ответ: 32102739 33561551011003

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

Задача 11#88161

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

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

Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.

Входные данные: Дано два входных файла (файл A и файл B), каждый из которых в первой строке содержит число            7
(1 ≤ N ≤ 10 )  – количество пунктов приёма биоматериалов. В каждой из следующих 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))

Ответ: 319539 329243859815

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

Задача 12#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
from math import ceil

f = open(’7_27B.txt’)
# k = 289
k = 451
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] = ceil(cnt / k)
    # Определяем крайние пункты
    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 += points[i] * i

# Если мы смещаемся на пункт вправо - расстояние до всех пунктов слева увеличится на 1,
# значит общая сумма увеличится на сумму пунктов слева

# Расстояние до всех пунктов справа уменьшится на 1,
# значит общая сумма уменьшится на сумму пунктов справа

# Сумма слева, на которую увеличится общая сумма при перемещении на один пункт вправо
left = 0
# Сумма справа, на которую уменьшится общая сумма при перемещении на один пункт вправо
right = sum(points)

current_cost = sm
# Список сумм для каждого пункта
costs = [sm]

for i in range(1, len(points)):
    # При перемещении на 1 пункт вправо из правой суммы исчезает самый перый элемент,
    # а к левой этот элемент прибавляется
    left += points[i - 1]
    right -= points[i - 1]
    # Рассчёт новой суммы, после увеличения суммы левой суммой и уменьшения правой суммой
    current_cost = current_cost + left - right
    if points[i] > 0:
                                                                                                  
                                                                                                  
        costs.append(current_cost)

print(min(costs))

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