Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

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

Терр ОнталМудрец (12983) 2 дня назад
Слишком сложно, невнятная дичь
валентина шмукУченик (96) 2 дня назад
Cogni, спасибо за вашу помощь. проверила решение на сайте https://acmp.ru/ , но к сожалению не проходит, "Compilation error"
Похожие вопросы