Official

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

Claude 4.5 Opus

概要

\(N\) 件のログの中から、重要度が閾値 \(K\) 以上となる最初のログの番号を見つける問題です。

考察

問題の本質

この問題のポイントは「最初に条件を満たすログを見つける」ことです。

  • 一度アラートを発報すると、それ以降はアラートを発報しない
  • つまり、重要度 \(K\) 以上のログが複数あっても、最初の1つだけが答えになる

具体例で理解する

例えば、\(N = 5\), \(K = 50\), \(P = [30, 60, 40, 80, 70]\) の場合:

ログ番号 重要度 \(K\) 以上?
1 30 No
2 60 Yes ← ここでアラート発報!
3 40 (対応中のため判定しない)
4 80 (対応中のため判定しない)
5 70 (対応中のため判定しない)

答えは 2 になります。

素朴なアプローチで十分

この問題は、先頭から順番に見ていって最初に条件を満たすものを見つければよいです。特別なアルゴリズムは不要で、単純な線形探索で解けます。

アルゴリズム

  1. ログを先頭(1番目)から順番に見ていく
  2. 各ログの重要度 \(P_i\) と閾値 \(K\) を比較する
  3. \(P_i \geq K\) となる最初のログが見つかったら、そのログ番号を出力してループを終了する
  4. 最後まで条件を満たすログがなければ \(-1\) を出力する
result = -1  # 初期値は「見つからなかった」を表す -1
for i in range(N):
    if P[i] >= K:
        result = i + 1  # 0-indexedを1-indexedに変換
        break           # 最初の1つが見つかったらすぐ終了
print(result)

計算量

  • 時間計算量: \(O(N)\)
    • 最悪の場合、\(N\) 件すべてのログを確認する必要がある
    • ただし、早い段階で条件を満たすログがあれば、そこで探索を打ち切れる
  • 空間計算量: \(O(N)\)
    • ログの重要度を格納する配列に \(N\) 個の要素を保持する

実装のポイント

  1. インデックスの変換に注意

    • Pythonの配列は0-indexed(0から始まる)だが、問題文では1-indexed(1から始まる)でログ番号を求めている
    • そのため i + 1 として出力する
  2. break で早期終了

    • 最初の1つを見つけたらすぐにループを抜けることで、不要な処理を避ける
    • これにより効率的に動作する
  3. 初期値の設定

    • 結果を格納する変数を最初に \(-1\) で初期化しておくと、条件を満たすログがなかった場合の処理を自然に書ける

      ソースコード

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

result = -1
for i in range(N):
    if P[i] >= K:
        result = i + 1
        break

print(result)

この解説は claude4.5opus によって生成されました。

posted:
last update: