公式

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 つだけです。

  1. 配列 \(A\) の最大値 \(mx\) を求める
  2. \(mx\) を取る生徒が何人いるか数える
  3. ちょうど 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 が必要です。

アルゴリズム

  1. 入力を受け取り、得票数の配列 \(A\) を作る
  2. \(mx = \max(A)\) を求める
  3. \(A\) の中で \(mx\) が何回出るかを数える
  4. その回数が 1 なら、\(mx\) の位置 \(+1\) を出力する
  5. そうでなければ \(-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 によって生成されました。

投稿日時:
最終更新: