Official

A - フィギュアスケート予選 / Figure Skating Qualifying Round Editorial by admin

Qwen3-Coder-480B

概要

各選手の得点から最高点と最低点を除いた平均点(またはそのままの平均点)を求め、基準点未満なら予選落ちとする。そのような選手の人数を求める問題。

考察

この問題では、各選手ごとに得点のリストが与えられ、その処理方法は審査員数 \(M\) によって変わります。

  • \(M \leq 2\) の場合は、すべての得点の平均値(小数点以下切り捨て)を最終得点とする。
  • \(M \geq 3\) の場合は、最大値と最小値を1つずつ取り除いた残りの得点の平均値(切り捨て)を最終得点とする。

素朴な方法としては、毎回得点リストをソートして最大・最小を除けばよいですが、これは十分高速です。なぜなら、\(M \leq 100\) であり、ソートしても \(O(M \log M)\) で、全体で \(N\) 人分処理するので \(O(N \cdot M \log M)\) となり、制約内で間に合います。

また、Pythonの整数除算 // を使うことで、小数点以下切り捨てが簡単に行えます。

アルゴリズム

  1. 各選手について以下の処理を行う:
    • 得点リストを取得。
    • \(M \leq 2\) ならば、全得点の和を \(M\) で割った商(切り捨て)を最終得点とする。
    • \(M \geq 3\) ならば、得点リストをソートし、両端(最大・最小)を除いた要素の平均(切り捨て)を最終得点とする。
  2. 最終得点が基準点 \(K\) 未満であれば、カウンタを増やす。
  3. カウンタの値を出力する。

例えば、選手の得点が [10, 20, 30, 40] で、\(K = 26\) のとき: - ソート後は [10, 20, 30, 40] - 両端を除くと [20, 30] - 平均は \((20 + 30) / 2 = 25\) - \(25 < 26\) なので予選落ち。

計算量

  • 時間計算量: \(O(N \cdot M \log M)\)
  • 空間計算量: \(O(M)\) (各選手の得点リストを保持)

\(M\) が最大100程度なので、十分高速に動作します。

実装のポイント

  • 整数の切り捨て除算には // を使用する。
  • ソート後に両端を除外する操作は sorted_scores[1:-1] で簡単に実現できる。
  • 各選手の得点リストは独立に処理できるため、メモリを節約するために再利用しても良い(ただし可読性とのバランスに注意)。
## ソースコード

```python
import math

# 入力の読み込み
N, M, K = map(int, input().split())
scores = []
for _ in range(N):
    row = list(map(int, input().split()))
    scores.append(row)

# 予選落ち人数のカウント
fail_count = 0

for i in range(N):
    score_list = scores[i]
    if M <= 2:
        # M <= 2 の場合、全得点の平均(切り捨て)
        total = sum(score_list)
        avg = total // M
    else:
        # M >= 3 の場合、最高点と最低点を除いた平均(切り捨て)
        sorted_scores = sorted(score_list)
        trimmed_scores = sorted_scores[1:-1]  # 最大と最小を1つずつ除外
        total = sum(trimmed_scores)
        avg = total // len(trimmed_scores)
    
    if avg < K:
        fail_count += 1

# 結果出力
print(fail_count)

この解説は qwen3-coder-480b によって生成されました。

posted:
last update: