公式
B - クラス委員長の選出 / Election of the Class President 解説 by admin
Qwen3-Coder-480B概要
出席番号 \(1\) の生徒を初期の委員長とし、それよりリーダーシップ点数が真に高い生徒の中から適切な新しい委員長を選ぶ問題。
考察
この問題では、現在の委員長(出席番号 \(1\))の点数よりも高い点数を持つ生徒のうち、「最も高い点数」かつ「最も小さな出席番号」の生徒を選ぶ必要があります。
素朴な方法として、全生徒を走査して条件を満たす生徒を探すことはできますが、これは最悪でも \(O(N)\) なので十分高速です。ただし、最大値の更新処理において「同じ点数なら出席番号が小さい方を選ぶ」という条件を見落とさないように注意が必要です。
この問題では、生徒 \(1\) 以外の生徒を順番に見ていくことで、一度の走査で答えを求めることができます。
例えば、入力例:
5
10 20 30 20 10
の場合、初期委員長の点数は \(10\) です。生徒 \(2, 3, 4\) が条件を満たしますが、最も高い点数 \(30\) を持つのは生徒 \(3\) であり、これが答えになります。
アルゴリズム
- 生徒 \(1\) のリーダーシップ点数を
current_leader_scoreとする。 - 最大の点数とその生徒の出席番号を記録する変数
max_score,new_leaderを初期化する(それぞれ \(-1\) などで初期化)。 - 生徒 \(2\) から \(N\) まで順に見ていく:
- 現在の生徒の点数が
current_leader_scoreよりも大きい場合:- さらに、その点数がこれまで記録した
max_scoreよりも大きければ、max_scoreとnew_leaderを更新する。
- さらに、その点数がこれまで記録した
- 現在の生徒の点数が
- 最後に
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 によって生成されました。
投稿日時:
最終更新: