Задача "Забастовки" Решение

Условие

Политическая жизнь одной страны очень оживленная. В стране действует K политических партий, каждая из которых регулярно объявляет национальную забастовку. Дни, когда хотя бы одна из партий объявляет забастовку, при условии, что это не суббота или воскресенье (когда и так никто не работает), наносят большой ущерб экономике страны.

i-я партия объявляет забастовки строго каждые b_i дней, начиная с дня с номером a_i. То есть i-я партия объявляет забастовки в дни a_i, a_i + b_i, a_i + 2 * b_i и т.д. Если в какой-то день несколько партий объявляет забастовку, то это считается одной общенациональной забастовкой.

В календаре страны N дней, пронумерованных, начиная с единицы. Первый день года является понедельником, шестой и седьмой дни года — выходные, неделя состоит из семи дней.

В первой строке даны числа N и K. Далее идет K строк, описывающие графики проведения забастовок. i-я строка содержит числа a_i и b_i. Вам нужно определить число забастовок, произошедших в этой стране в течении года.

Решение

N, K = [int(s) for s in input().split()]
work_days = set([day for day in range(1, N + 1) if day % 7 not in (6, 0)])
no_strikes = set(work_days)
for party in range(K):
    a, b = [int(s) for s in input().split()]
    max_strikes = (N - a) // b + 1
    no_strikes -= {a + b*i for i in range(max_strikes)}
print(len(work_days) - len(no_strikes))

Комментарии

  1. Предлагаю считать дни недели и дни года не с единицы, а с нуля.
    Тогда многое упростится, например, вторая строка, сейчас
    work_days = set([day for day in range(1, N + 1) if day % 7 not in (6, 0)])
    станет такой:
    work_days = set([day for day in range(N) if day % 7 < 5)

  2. Кроме того, ваше решение не очень-то эффективное: вы заводите множество рабочих дней (за год это примерно 260 дней), потом делаете его копию в no_strikes (еще 260 элементов), потом из no_strikes вычеркиваете дни забастовок (допустим, 150 дней). Зачем все это? Дважды неоптимально: во-первых, можно было сразу запомнить длину множества work_days, и его копия не нужна, работайте с ним самим. Во-вторых, лучше вместо всего этого заведите множество забастовочных дней (длина 150) и вычеркните все выходные (множество длины 104).

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

Добавить комментарий

Ваш e-mail не будет опубликован.