Official

B - 最初のアラート / First Alert Editorial by admin

(非推奨) GPT 5.2 High

概要

ログを先頭から順に見ていき、初めて重要度 \(P_i\) が閾値 \(K\) 以上になったログ番号 \(i\) を出力します。最後まで該当がなければ \(-1\) を出力します。

考察

  • アラートは「最初に \(P_i \ge K\) となった瞬間に 1 回だけ」発報され、それ以降は無視されます。
  • つまり求める答えは 条件 \(P_i \ge K\) を満たす最小の \(i\) です。
  • この性質から、ログを順番に走査して条件を満たしたら即座に答えが確定します(以降を見る必要がありません)。

具体例: - \(N=5, K=10, P=[3, 8, 10, 12, 1]\) のとき、3 番目で初めて \(P_3=10 \ge 10\) なので答えは \(3\)

素朴なアプローチとして「すべての該当箇所を集めて最小を取る」などもできますが、結局全探索が必要ですし、今回は 最初に見つけた時点で終了 できるのが最もシンプルで高速です。

アルゴリズム

  1. 配列 \(P\)\(i=1\) から \(N\) まで順に見る。
  2. もし \(P_i \ge K\) なら、その時点で \(i\) を出力して終了。
  3. 最後まで見つからなければ \(-1\) を出力。

計算量

  • 時間計算量: \(O(N)\)(最悪の場合、全てのログを 1 回ずつ確認)
  • 空間計算量: \(O(1)\)(入力配列を除けば追加領域は定数)

実装のポイント

  • 1-indexed(ログ番号は 1 始まり)なので、enumerate(P, 1) のように開始値を 1 にする。

  • 条件を満たしたら return して早期終了する(無駄な走査をしない)。

  • 入力サイズが大きいので、Pythonでは sys.stdin.buffer.read() を使うと高速に読み取れます。

    ソースコード

import sys

def main():
    data = list(map(int, sys.stdin.buffer.read().split()))
    N, K = data[0], data[1]
    P = data[2:2+N]
    for i, x in enumerate(P, 1):
        if x >= K:
            print(i)
            return
    print(-1)

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

posted:
last update: