名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

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)

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