Official

A - 本棚の整理 / Organizing the Bookshelf Editorial by admin

Qwen3-Coder-480B

概要

本棚に並ぶ本のうち、指定された管理番号を持つ本のうち最も左にあるものの位置を求める問題。

考察

この問題は、与えられた数列 \(A_1, A_2, \ldots, A_N\) の中から、値が \(K\) である要素のうち最も左(インデックスが最も小さい)の位置を見つけ出すだけです。

素朴な方法として、左から順番に本を確認していき、初めて管理番号が \(K\) である本を見つけたらその位置を出力すればよいです。これは線形探索と呼ばれる基本的な手法であり、特に問題なく動作します。

重要なのは、「最も小さい位置」を求めるので、最初に見つけた時点で答えを出力して終了すれば十分だということです。また、該当する本が存在しない場合のために、最後まで探して見つからなかったら \(-1\) を出力する必要があります。

この問題では制約が \(N \leq 2 \times 10^5\) なので、全探索しても間に合います(Python なら最大約 \(10^8\) 回程度の操作が許容される目安)。したがって、より複雑なアルゴリズム(二分探索など)は必要ありません。

アルゴリズム

  1. 入力から \(N\), \(K\), および数列 \(A\) を受け取る。
  2. 左から順番に \(A_i\) を見て行き、\(A_i = K\) となる最小の \(i\) を探す。
  3. 見つかったら \(i+1\) (1-indexedでの位置)を出力してプログラムを終了する。
  4. 最後まで見つからなかったら \(-1\) を出力する。

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(N)\)

※入力の配列を保持するのに \(O(N)\) 必要であり、探索自体も最悪で全ての要素を確認するため \(O(N)\)。

実装のポイント

  • Python では exit() を使うことでプログラムを即座に終了できる。これにより、最初に見つけた時点で処理を止めることができる。
  • インデックスは0始まりだが、出力は1始まりであることに注意すること。

ソースコード

N, K = map(int, input().split())
A = list(map(int, input().split()))

for i in range(N):
    if A[i] == K:
        print(i + 1)
        exit()

print(-1)

この解説は qwen3-coder-480b によって生成されました。