水面下の夢

競プロやイラストに興味があります.メインブログがここ.同人サークル「かのらぶ」のページはこっち( https://yumechi0525.amebaownd.com ).ブログアイコンはYaQ(@8_9_00)さんから.

ARC 010 B - 超大型連休(2015/06/01)

回答

Submission #309211 - AtCoder Regular Contest 010 | AtCoder

祝日をリセットして,新しい祝日を決めたので,連休の数を求めてくださいという問題.
日月を日だけで表現し(例えば,2/1なら30日目といったように),先に土日を埋め,読み込んだ祝日をあとで埋めるといった感じでしょうか.
祝日は,すでに指定された日にちが土日祝であれば,それ以降の平日を祝日とするので,その処理を入れる.ただし,私は下手くそなので,12月の最後のほうで来年の1/1まで祝日にしようとしていてREを連発させていました.ヘボい.(要注意です)
最後はfor文で連続しているところがあるかどうかを調べて,連続しているところの最大値を出力し,終わりです.

N = int(input())
months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
 
m_start_day = [0]
for i in range(0, 11):
    m_start_day.append(m_start_day[i] + months[i])
 
holi = [False for _ in range(0, 366)]
for i in range(0, 366):
    if i % 7 == 0 or i % 7 == 6:
        holi[i] = True
 
for _ in range(N):
    m, d = map(lambda x: int(x) - 1, input().split("/"))
    nowday = m_start_day[m] + d
    if holi[nowday]:
        i = 1
        while (nowday + i) <= 365 and holi[nowday + i]:
            i += 1
            if nowday + i >= 366:
                break
        else:
            if nowday + i <= 365:
                holi[nowday + i] = True
    else:
        holi[nowday] = True
 
count = 0
res = 0
for i in range(0, 366):
    if holi[i]:
        count += 1
    else:
        res = max(res, count)
        count = 0
else:
    res = max(res, count)
print(res)

日数のみの表現に困ったこともあり,ちょっとプログラムが長く,冗長になってしまったかも.