Bisect на Python: найдите ближайшую точку на числовой прямой

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Heapq и bisect в Python: задачи на кучи и приоритетные очереди.

Автоматическая стыковка на монорельсе

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

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

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

Что уже дано

Готовая заготовка импортирует bisect_left из модуля bisect, считывает входные данные из стандартного потока ввода, вызывает функцию total_docking_distance и выводит результат.

Что нужно сделать

Реализуйте функцию total_docking_distance(platforms: list[int], modules: list[int]) -> int.

Функция принимает список координат сервисных площадок platforms и список точек сброса модулей modules.

Правила стыковки:

  • Площадки неподвижны и остаются доступными для любого количества модулей (выбор площадки одним модулем не блокирует и не исключает её для остальных).
  • Каждый модуль направляется к площадке с минимальным абсолютным расстоянием от точки сброса.
  • Если две соседние площадки находятся на одинаковом расстоянии от модуля, выбирается площадка с меньшей координатой.
  • Пробег модуля равен модулю разности между координатой его сброса и координатой выбранной площадки.
  • Если список модулей пуст (modules пустой), суммарный пробег равен 0.

Функция должна вернуть одно неотрицательное целое число — сумму расстояний пробега всех модулей.

Ввод и вывод

Программа взаимодействует с проверяющей системой через стандартные потоки stdin и stdout.

Формат ввода

  • Первая строка содержит два целых числа через пробел: количество площадок () и количество модулей ().
  • Вторая строка содержит целых чисел, разделенных пробелами, — координаты сервисных площадок, строго упорядоченные по возрастанию.
  • Третья строка содержит целых чисел, разделенных пробелами, — координаты сброса модулей. Если , эта строка пустая.

Все координаты лежат в диапазоне от до .

Формат вывода

Одно целое неотрицательное число — суммарный пробег всех модулей.

Пример

Ввод
3 5
0 10 20
3 5 10 16 25
Вывод
17
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи