Top.Mail.Ru
Ответы
Аватар пользователя
5 месяцев назад
от

Задача про праздники

Помогите решить эту задачу, пожалуйста. Парламент некоторой страны принял новый закон о праздничных днях. Согласно этому закону первые K (1≤K≤50) дней года, а также 23 февраля (День 2-го тура олимпиады по информатике) и 8 марта объявляются праздничными, а все остальные праздники отменяются. При этом все выходные (суббота и воскресенье), попавшие на праздничные дни, переносятся на следующие за этими праздниками рабочие дни. В зависимости от того, на какой день недели приходится 1 января, количество нерабочих дней, которые идут подряд, может меняться. Требуется определить, какое наибольшее количество нерабочих дней может идти подряд. По формуле 2 + (k % 5) + 7 * (k // 5) прохожу 80% тестов, а потом никак не могу правильно решить с праздниками. Заранее спасибои

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Просветленный
5мес
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
 from datetime import date, timedelta 
 
def solve(): 
    k = int(input()) 
    max_consecutive = 0 
 
    for start_day in range(7):  # 0 for Monday, 6 for Sunday 
        is_holiday = [False] * 365 
 
        # Отмечаем первые K дней как праздничные 
        for i in range(k): 
            is_holiday[i] = True 
 
        # Отмечаем 23 февраля и 8 марта 
        def day_of_year(month, day, start_day_offset): 
            first_day = date(2024, 1, 1) + timedelta(days=start_day_offset) 
            target_date = date(first_day.year, month, day) 
            if target_date < first_day: 
                target_date = date(first_day.year + 1, month, day) # Handle wrapping around the year 
            return (target_date - (date(target_date.year, 1, 1))).days 
 
        day_23_feb = day_of_year(2, 23, start_day) 
        day_8_mar = day_of_year(3, 8, start_day) 
 
        if 0 <= day_23_feb < 365: 
            is_holiday[day_23_feb] = True 
        if 0 <= day_8_mar < 365: 
            is_holiday[day_8_mar] = True 
 
        # Перенос праздников с выходных 
        changed = True 
        while changed: 
            changed = False 
            for i in range(365): 
                current_date = date(2024, 1, 1) + timedelta(days=i + start_day) 
                day_of_week = current_date.weekday()  # 0 - понедельник, 6 - воскресенье 
                if is_holiday[i] and (day_of_week == 5 or day_of_week == 6):  # Праздник в субботу или воскресенье 
                    # Находим ближайший рабочий день после праздника 
                     переноса 
                    исходный_день = i 
                    while True: 
                        исходный_день += 1 
                        if исходный_день >= 365: 
                            break  #  Если перенос выходит за рамки года (маловероятно, но для надежности) 
                        новая_дата = date(2024, 1, 1) + timedelta(days=исходный_день + start_day) 
                        новый_день_недели = новая_дата.weekday() 
                        if новый_день_недели < 5 : # Понедельник - пятница 
                            if not is_holiday[исходный_день]: 
                                is_holiday[исходный_день] = True 
                                is_holiday[i] = False 
                                changed = True 
                            break 
                    break # Начинаем проверку заново после изменения 
 
        # Расчет максимального количества подряд идущих нерабочих дней 
        current_consecutive = 0 
        for i in range(365): 
            current_date = date(2024, 1, 1) + timedelta(days=i + start_day) 
            day_of_week = current_date.weekday() 
            if is_holiday[i] or day_of_week >= 5:  # Праздник или выходной (суббота, воскресенье) 
                current_consecutive += 1 
            else: 
                max_consecutive = max(max_consecutive, current_consecutive) 
                current_consecutive = 0 
        max_consecutive = max(max_consecutive, current_consecutive)