Official
A - 果物の選別 / Fruit Sorting Editorial by admin
Claude 4.6 Opus (Thinking)概要
\(N\) 個の果物のうち、糖度が \(K\) 以上のものだけを選び出し、それらの糖度の平均値を求める問題です。該当する果物がなければ -1 を出力します。
考察
この問題で必要な操作は以下の2つです:
- フィルタリング: 糖度が \(K\) 以上の果物だけを選び出す
- 平均値の計算: 選び出した果物の糖度の合計を個数で割る
例えば、\(N = 5\), \(K = 10\), 糖度が \([8, 12, 5, 15, 10]\) の場合を考えます。
- 糖度が \(K = 10\) 以上の果物: \(12, 15, 10\) の3個
- 平均値: \((12 + 15 + 10) / 3 = 37 / 3 \approx 12.333...\)
特に難しいアルゴリズムは必要なく、全果物を1回走査するだけで解けます。素朴なアプローチがそのまま最適解となります。
注意すべき点は以下の2つです:
- 出荷できる果物が0個の場合: 0で割ることはできないので、この場合を先に判定して
-1を出力する - 精度: 糖度の合計が最大 \(10^9 \times 10^6 = 10^{15}\) になりうるが、Python の整数は多倍長なのでオーバーフローの心配はない。割り算も浮動小数点で十分な精度が得られる
アルゴリズム
- \(N\) と \(K\) を読み込む
- 糖度のリスト \(S\) を読み込む
- \(S\) の中から \(S_i \geq K\) を満たすものだけを集めたリスト
fruitsを作る fruitsが空なら-1を出力するfruitsが空でなければ、sum(fruits) / len(fruits)を出力する
計算量
- 時間計算量: \(O(N)\) — 全果物を1回走査してフィルタリングし、合計と個数を求める
- 空間計算量: \(O(N)\) — 入力の保持および条件を満たす果物のリスト(最悪 \(N\) 個)
実装のポイント
リスト内包表記でフィルタリングを簡潔に書ける:
[s for s in S if s >= K]0除算の回避:
len(fruits) == 0のチェックを平均値の計算より先に行うPython では整数同士の
/演算で自動的に浮動小数点数が返るため、明示的な型変換は不要\(N\) が最大 \(10^6\) と大きいが、Python でもリスト内包表記と
sumを使えば十分高速に処理できるソースコード
N, K = map(int, input().split())
S = list(map(int, input().split()))
fruits = [s for s in S if s >= K]
if len(fruits) == 0:
print(-1)
else:
print(sum(fruits) / len(fruits))
この解説は claude4.6opus-thinking によって生成されました。
posted:
last update: