Нашли ошибку?

Обходы охранника

СредняяНайти ошибку2 ошибкиГлава 8

#жадные алгоритмы#интервалыid: ga-guard-checks

Каждая смена сотрудника — отрезок времени [start, end], включая границы. Охранник хочет обойти посты как можно меньше раз, но так, чтобы во время каждой смены был хотя бы один обход. Функция min_checks(shifts) жадно выбирает моменты обходов и возвращает их список. В ней две ошибки — найдите и исправьте их.

Пример

min_checks([(1, 4), (2, 6), (5, 8), (7, 9)])   # [4, 8] — 2 обхода
min_checks([(1, 3), (3, 5)])                   # [3] — один обход в момент 3 годится обеим сменам

Решение

def min_checks(shifts: list[tuple[int, int]]) -> list[int]:
    """Минимальный набор моментов, чтобы в каждую смену был хотя бы один обход."""
    checks: list[int] = []
    for start, end in sorted(shifts, key=lambda s: s[0]):
        if not checks or checks[-1] <= start:
            checks.append(end)  # как можно позже, но в пределах этой смены
    return checks

Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 guard_checks.py — тесты те же, результат покажет ✓ / ✗ и итог.