A - クラス委員長の選出 / Election of the Class President 解説 by admin
GPT 5.4 High概要
得票数の最大値を持つ生徒がただ \(1\) 人かどうかを調べ、ただ \(1\) 人ならその生徒番号、複数人いるなら \(-1\) を出力する問題です。
考察
この問題で必要なのは、誰が何票取ったかを順位付けすることではなく、最大得票数が何票で、それを取った人が何人いるかを知ることです。
たとえば、得票数が
\([3, 5, 2, 5]\)
なら最大値は \(5\) ですが、それを取っている生徒が 2 人いるので答えは \(-1\) です。
一方で
\([3, 5, 2, 4]\)
なら最大値は \(5\) で、それを取っているのは生徒 \(2\) だけなので答えは \(2\) になります。
重要な気づき
必要なのは次の 3 つだけです。
- 配列 \(A\) の最大値 \(mx\) を求める
- \(mx\) を取る生徒が何人いるか数える
- ちょうど 1 人ならその位置を出す
素朴な方法について
たとえば得票数をソートして最大値を確認することもできますが、ソートは \(O(N \log N)\) かかります。
この問題では最大値とその個数だけ分かればよいので、ソートまでするのは少し大げさです。
配列をそのまま走査すれば十分で、\(N \leq 2 \times 10^5\) でも高速に処理できます。
どう解決するか
Python では次の組み込み関数が使えます。
max(a): 最大値を求めるa.count(mx): 最大値が何回現れるか数えるa.index(mx): 最大値が最初に現れる位置を求める
最大値が 1 回だけなら、その位置に対応する生徒番号を出力します。
ただし index が返すのは 0-indexed の位置なので、生徒番号にするために +1 が必要です。
アルゴリズム
- 入力を受け取り、得票数の配列 \(A\) を作る
- \(mx = \max(A)\) を求める
- \(A\) の中で \(mx\) が何回出るかを数える
- その回数が 1 なら、\(mx\) の位置 \(+1\) を出力する
- そうでなければ \(-1\) を出力する
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(N)\)
max, count, index はそれぞれ配列を 1 回ずつ見るので、合計では \(O(3N)\) です。
定数倍を無視すれば \(O(N)\) です。
実装のポイント
生徒番号は \(1\) から始まるので、
a.index(mx)の結果に+1する必要があります。最大値が複数回ある場合は、その位置を調べる前に
-1を出します。入力は
sys.stdin.buffer.read()を使ってまとめて読み込んでおり、大きな入力でも高速です。ソースコード
import sys
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
n = data[0]
a = data[1:1 + n]
mx = max(a)
if a.count(mx) == 1:
print(a.index(mx) + 1)
else:
print(-1)
if __name__ == "__main__":
main()
この解説は gpt-5.4-high によって生成されました。
投稿日時:
最終更新: