🍣

Kicstart2020 RoundC: Countdown

2021/06/12に公開

https://codingcompetitions.withgoogle.com/kickstart/round/000000000019ff43/00000000003380d2

問題

長さがmで、m,m-1,m-2,...,2,1のsubarrayをm-countdownと呼ぶ。この時、N個の要素を含む配列とKが与えられた時に、幾つのK-countdownが含まれているかを求める。
2 \leq K \leq N、Test set1では2 \leq N \leq 1000、Test set2では高々10ケースで2 \leq N \leq 2 \times 10^5で残りはTest set1と同じサイズ。

アルゴリズムと実装

各要素を一つずつ走査して、previousの要素よりも1小さくなっているかを確認し、Trueの場合には連続していることを表すカウンタを1つ増やす。Falseの場合にはカウンタを0に戻す。
現在の要素が1で、かつカウンタが少なくともK-1になっていればK-countdownが見つかったとして、結果をインクリメントする。(開始位置ではカウンタは0)

T = int(input())
for t in range(1, T + 1):
    N, K = list(map(int, input().split()))
    data = list(map(int, input().split()))
    res = 0
    dc = 0
    for i in range(1, N):
        if data[i] == data[i-1] - 1:
            dc += 1
        else:
            dc = 0
        if data[i] == 1 and dc >= K - 1:
            res += 1
    print('Case #{}: {}'.format(t, res))

Discussion