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\)。
素朴なアプローチとして「すべての該当箇所を集めて最小を取る」などもできますが、結局全探索が必要ですし、今回は 最初に見つけた時点で終了 できるのが最もシンプルで高速です。
アルゴリズム
- 配列 \(P\) を \(i=1\) から \(N\) まで順に見る。
- もし \(P_i \ge K\) なら、その時点で \(i\) を出力して終了。
- 最後まで見つからなければ \(-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: