公式
A - クラス委員長の選出 / Election of the Class President 解説 by admin
gpt-5.3-codex概要
得票数の最大値を持つ生徒が「ただ1人かどうか」を判定する問題です。
最大得票数が一意ならその生徒番号(1-indexed)を、同率1位が複数人なら \(-1\) を出力します。
考察
重要なのは、委員長になれる条件が「最大値そのもの」ではなく最大値の出現回数で決まることです。
- まず得票数配列 \(A\) の最大値 \(mx\) を求める
- 次に \(mx\) が何回出てくるかを数える
- 1回なら、その位置の生徒が委員長
- 2回以上なら同率1位なので \(-1\)
例えば \(A = [3, 5, 2, 5]\) なら最大値は \(5\) で2人いるため \(-1\)。
\(A = [1, 4, 2, 3]\) なら最大値は \(4\) で1人だけなので、生徒番号 \(2\) を出力します。
素朴な方法について
各生徒について「自分より大きい得票があるか」を毎回確認すると、二重ループで \(O(N^2)\) になり、\(N \le 2 \times 10^5\) では間に合いません。
一方、max, count, index を使えばそれぞれ配列1周で済み、全体でも線形時間で解けます。
アルゴリズム
- 入力を受け取る
mx = max(A)で最大得票数を求めるcnt = A.count(mx)で最大得票数の人数を求めるcnt == 1ならA.index(mx) + 1を出力(問題は1始まり)- それ以外は
-1を出力
計算量
- 時間計算量: \(O(N)\)
(max,count,indexがそれぞれ \(O(N)\)、合計でも定数倍の \(O(N)\)) - 空間計算量: \(O(N)\)
(入力配列 \(A\) を保持するため)
実装のポイント
生徒番号は 1-indexed なので、
indexの結果に+1が必要です。sys.stdin.readlineを使うと入力が速く、競技プログラミング向きです。制約上、得票数 \(A_i\) は0を含むため、最大値が0でも同様に正しく判定できます。
ソースコード
import sys
def main():
input = sys.stdin.readline
N = int(input().strip())
A = list(map(int, input().split()))
mx = max(A)
cnt = A.count(mx)
if cnt == 1:
print(A.index(mx) + 1) # 1-indexed
else:
print(-1)
if __name__ == "__main__":
main()
この解説は gpt-5.3-codex によって生成されました。
投稿日時:
最終更新: