Official

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

GPT 5.2 High

概要

糖度が \(K\) 以上の果物だけを集め、その糖度の平均を求めます。対象が1つもなければ平均は定義できないので -1 を出力します。

考察

求めたいのは「条件(\(S_i \ge K\))を満たす要素の平均」です。平均は - 合計 \(\div\) 個数
で計算できるため、必要なのは 条件を満たす果物の合計値個数 の2つだけです。

例えば \(N=5, K=10, S=[8,10,12,9,15]\) のとき、出荷できるのは \([10,12,15]\) なので - 合計 \(= 10+12+15 = 37\) - 個数 \(= 3\) - 平均 \(= 37/3\)

ここで、素朴に「条件を満たすものだけ別リストに詰めてから平均を取る」こともできますが、\(N \le 10^6\) と大きいため、余計な配列を作るとメモリを無駄に使います。また Python では入力が多いので、input() を繰り返すと遅くなり TLE の原因になりがちです。
そこで、1回のループで合計と個数だけを更新し、入力も まとめて高速に読み込むのが安全です。

また、条件を満たす個数が \(0\) の場合は \(0\) で割れないので、-1 を出力する分岐が必要です。

アルゴリズム

  1. \(N, K\) と配列 \(S\) を読み込む。
  2. total = 0, cnt = 0 を用意する。
  3. \(x \in S\) について:
    • もし \(x \ge K\) なら total += x, cnt += 1
  4. cnt == 0 なら -1 を出力。
  5. そうでなければ平均 total / cnt を出力する(誤差許容があるので浮動小数でOK)。

計算量

  • 時間計算量: \(O(N)\)(各要素を1回ずつ見る)
  • 空間計算量: \(O(1)\)(合計と個数など定数個の変数のみ)

実装のポイント

  • 入力が最大 \(10^6\) 個なので、sys.stdin.buffer.read() でまとめて読み込むと高速です。

  • 合計は最大で \(10^6 \times 10^9 = 10^{15}\) になり得ますが、Python の整数はオーバーフローしないので安全です。

  • 出力は "{:.10f}".format(...) のように十分な桁数で出せば、誤差条件 \(10^{-6}\) を確実に満たしやすくなります。

    ソースコード

import sys

def main():
    data = list(map(int, sys.stdin.buffer.read().split()))
    if not data:
        return
    N, K = data[0], data[1]
    S = data[2:2+N]

    total = 0
    cnt = 0
    for x in S:
        if x >= K:
            total += x
            cnt += 1

    if cnt == 0:
        print(-1)
    else:
        print("{:.10f}".format(total / cnt))

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

posted:
last update: