AtCoder Beginner Contest 194 E – Mex Min をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Beginner Contest 194 E – Mex Min

Mexとは、minimum excludedの略……らしい。しばしば出てくる。この回答では特にそれっぽいデータ構造などを利用することもなく、尺取法で順に見ていっている。

# AtCoder Beginner Contest 194 E - Mex Min
# https://atcoder.jp/contests/abc194/tasks/abc194_e
# tag: 数列 MEX 最小値 尺取法

# 最小値さえ求まればいいので、途中で
# 個数が 0 になる整数を列挙できればいい……
# という発想。

def main():
N, M = map(int, input().split())
A = list(map(int, input().split()))

# 1 ~ N の個数をカウントするリスト
cnt = [0] * (N+1)

# 数列の最初の M 個については
# 愚直に数え、MEX も愚直に探す。
for a in A[:M]:
cnt[a] += 1
result = cnt.index(0)

# ここから尺取法
for i in range(N-M):
addition = A[i+M]
removal = A[i]

# 追加される数字(右端)の個数を 1 増やす。
cnt[addition] += 1

# 削除される数字(左端)の個数を 1 減らす。
cnt[removal] -= 1

# 減らした後 0 個になっていれば、今の最小値と比較する。
# ちなみに、 0 個になったとしても、同時に
# もっと小さな数が 0 個である可能性もあるため、
# そのタイミングでの MEX とは限らない。
# しかし、求める最小値は必ず一度は 0 になるので、
# 回答としては問題ない。
if cnt[removal] == 0:
if removal < result:
result = removal

print(result)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です