公式

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周で済み、全体でも線形時間で解けます。

アルゴリズム

  1. 入力を受け取る
  2. mx = max(A) で最大得票数を求める
  3. cnt = A.count(mx) で最大得票数の人数を求める
  4. cnt == 1 なら A.index(mx) + 1 を出力(問題は1始まり)
  5. それ以外は -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 によって生成されました。

投稿日時:
最終更新: