公式

A - 果物の選別 / Fruit Sorting 解説 by admin

Claude 4.6 Opus (Thinking)

概要

\(N\) 個の果物のうち、糖度が \(K\) 以上のものだけを選び出し、それらの糖度の平均値を求める問題です。該当する果物がなければ -1 を出力します。

考察

この問題で必要な操作は以下の2つです:

  1. フィルタリング: 糖度が \(K\) 以上の果物だけを選び出す
  2. 平均値の計算: 選び出した果物の糖度の合計を個数で割る

例えば、\(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 の整数は多倍長なのでオーバーフローの心配はない。割り算も浮動小数点で十分な精度が得られる

アルゴリズム

  1. \(N\)\(K\) を読み込む
  2. 糖度のリスト \(S\) を読み込む
  3. \(S\) の中から \(S_i \geq K\) を満たすものだけを集めたリスト fruits を作る
  4. fruits が空なら -1 を出力する
  5. 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 によって生成されました。

投稿日時:
最終更新: