A - クラス委員長の選出 / Election of the Class President 解説 by admin
Claude 4.6 Opus (Thinking)概要
\(N\) 人の生徒の得票数が与えられたとき、最多得票者がただ1人ならその生徒番号を、複数いるなら \(-1\) を出力する問題です。
考察
この問題で必要な処理は以下の2つです:
- 最大得票数を求める:全員の得票数の中で最も大きい値は何か?
- その最大得票数を持つ人が何人いるか数える:1人なら委員長決定、2人以上なら決められない。
例えば、\(N = 5\) で得票数が [3, 5, 2, 5, 1] の場合を考えます。
- 最大得票数は \(5\)
- \(5\) 票を獲得した生徒は生徒2と生徒4の 2人 いる
- よって委員長は決められず、答えは \(-1\)
別の例として、得票数が [3, 7, 2, 5, 1] の場合:
- 最大得票数は \(7\)
- \(7\) 票を獲得した生徒は生徒2の 1人だけ
- よって答えは \(2\)
この問題は素朴にリストを走査するだけで十分高速に解けます。\(N\) が最大 \(2 \times 10^5\) なので、リストを数回走査する \(O(N)\) の解法で問題ありません。
アルゴリズム
- 得票数のリスト \(A\) から最大値
max_valを求める(max(A))。 max_valと等しい要素がリスト内にいくつあるか数える(A.count(max_val))。- その個数が \(1\) なら、最大値を持つ要素のインデックスを求め(
A.index(max_val))、1-indexed に変換して出力する。 - 個数が \(2\) 以上なら \(-1\) を出力する。
計算量
- 時間計算量: \(O(N)\)
max(A)でリストを1回走査:\(O(N)\)A.count(max_val)でリストを1回走査:\(O(N)\)A.index(max_val)でリストを最大1回走査:\(O(N)\)- 合計で \(O(N)\)
- 空間計算量: \(O(N)\)(得票数のリストを保持するため)
実装のポイント
1-indexed と 0-indexed の変換:Pythonのリストは0始まり(0-indexed)ですが、問題では生徒番号が1始まり(1-indexed)です。
A.index(max_val)は0-indexedの位置を返すため、出力時に+1する必要があります。countとindexの活用:Pythonのリストには便利なメソッドがあり、countで特定の値の出現回数、indexで最初に現れる位置を簡単に取得できます。最大値が0の場合:\(A_i = 0\) が許されていますが、全員が \(0\) 票でも「最多得票者が複数」として \(-1\) を正しく出力できます(\(N \geq 2\) の場合)。\(N = 1\) の場合は必ずその1人が委員長になります。
ソースコード
N = int(input())
A = list(map(int, input().split()))
max_val = max(A)
if A.count(max_val) == 1:
print(A.index(max_val) + 1)
else:
print(-1)
この解説は claude4.6opus-thinking によって生成されました。
投稿日時:
最終更新: