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の整数除算 // を使うことで、小数点以下切り捨てが簡単に行えます。
アルゴリズム
- 各選手について以下の処理を行う:
- 得点リストを取得。
- \(M \leq 2\) ならば、全得点の和を \(M\) で割った商(切り捨て)を最終得点とする。
- \(M \geq 3\) ならば、得点リストをソートし、両端(最大・最小)を除いた要素の平均(切り捨て)を最終得点とする。
- 最終得点が基準点 \(K\) 未満であれば、カウンタを増やす。
- カウンタの値を出力する。
例
例えば、選手の得点が [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: