Official

B - クラス委員長の選出 / Election of the Class President Editorial by admin

Qwen3-Coder-480B

概要

出席番号 \(1\) の生徒を初期の委員長とし、それよりリーダーシップ点数が真に高い生徒の中から適切な新しい委員長を選ぶ問題。

考察

この問題では、現在の委員長(出席番号 \(1\))の点数よりも高い点数を持つ生徒のうち、「最も高い点数」かつ「最も小さな出席番号」の生徒を選ぶ必要があります。

素朴な方法として、全生徒を走査して条件を満たす生徒を探すことはできますが、これは最悪でも \(O(N)\) なので十分高速です。ただし、最大値の更新処理において「同じ点数なら出席番号が小さい方を選ぶ」という条件を見落とさないように注意が必要です。

この問題では、生徒 \(1\) 以外の生徒を順番に見ていくことで、一度の走査で答えを求めることができます。

例えば、入力例:

5
10 20 30 20 10

の場合、初期委員長の点数は \(10\) です。生徒 \(2, 3, 4\) が条件を満たしますが、最も高い点数 \(30\) を持つのは生徒 \(3\) であり、これが答えになります。

アルゴリズム

  1. 生徒 \(1\) のリーダーシップ点数を current_leader_score とする。
  2. 最大の点数とその生徒の出席番号を記録する変数 max_score, new_leader を初期化する(それぞれ \(-1\) などで初期化)。
  3. 生徒 \(2\) から \(N\) まで順に見ていく:
    • 現在の生徒の点数が current_leader_score よりも大きい場合:
      • さらに、その点数がこれまで記録した max_score よりも大きければ、max_scorenew_leader を更新する。
  4. 最後に new_leader を出力(更新されなかった場合は \(-1\) のまま)。

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(1)\) (入力配列を除く)

実装のポイント

  • 出席番号は \(1\)-indexed であることに注意(配列のインデックスは \(0\) から始まるので、出力時は i + 1 にする)。
  • 「点数が同じなら出席番号が小さい方を選ぶ」必要がないのは、前から順に見ていって最初に見つけたものが最小の出席番号となるため、自然と満たされる。
  • 条件 A[i] > current_leader_score は「真に大きい」ことを確認しているため、等号は不要。
## ソースコード

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

current_leader_score = A[0]
max_score = -1
new_leader = -1

for i in range(1, N):
    if A[i] > current_leader_score:
        if A[i] > max_score:
            max_score = A[i]
            new_leader = i + 1

print(new_leader)

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

posted:
last update: