CS Academy Round #41: B. Cinema Seats
微妙に面倒。さらにコーナー。
problem
0
1
の列が与えられる。高々$1$回のswapをして、連続する0
の数を最大化せよ。
solution
0
の列が間にちょうどひとつの1
を挟んで隣接しているなら併合できる。
そんな感じで探す。ただし000001
や111001000111
のような1
を飛ばす先が足りてないケースに注意する。
$O(N)$。
implementation
#!/usr/bin/env python3
def solve(s):
result = 0
last_l, last_r = (-3, -2)
l = 0
while l < len(s):
while l < len(s) and s[l] == '1':
l += 1
if l == len(s):
break
r = l + 1
while r < len(s) and s[r] == '0':
r += 1
result = max(result, r - l + 1)
if last_r + 1 == l:
result = max(result, r - last_l)
last_l, last_r = (l, r)
l = r
result = min(s.count('0'), result)
return result
print(solve(input()))