公式

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

GPT 5.2 High

概要

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

考察

重要なのは「平均は \(\\text{合計} / \\text{個数}\) で求まる」ため、出荷可能な果物について 合計値個数 だけ分かれば十分、という点です。

  • 例えば \(S=[3,7,8,2],\\ K=6\) のとき、出荷可能なのは \(7,8\) なので、合計 \(15\)・個数 \(2\)・平均 \(7.5\) です。
  • 出荷可能な果物がないケース(例:全部 \(K\) 未満)では割り算ができないため、特別に -1 を出力します。

また制約が \(N \\le 10^6\) と大きいので、素朴に - 出荷可能な果物を配列に集めてから平均を計算する(余計なメモリが必要) - 標準入力を遅い方法で大量に読む(PythonではTLEの原因になりやすい)

といった実装は不利です。そこで、読みながら条件を満たすものだけ合計・カウントする(1回走査)方法にします。さらに入力を高速化するため、sys.stdin.buffer.read() で一括読み込みして整数をパースしています。

アルゴリズム

  1. \(total=0\)(出荷可能な糖度の合計)、\(cnt=0\)(出荷可能な個数)を用意する。
  2. \(i=1..N\) について糖度 \(S_i\) を読む。
    • もし \(S_i \\ge K\) なら、\(total \\leftarrow total + S_i\)\(cnt \\leftarrow cnt + 1\)
  3. 走査後、
    • \(cnt=0\) なら -1 を出力。
    • そうでなければ平均 \(total/cnt\) を十分な精度で出力する(このコードでは小数点以下10桁)。

計算量

  • 時間計算量: \(O(N)\)(各果物を1回ずつ見るだけ)
  • 空間計算量: \(O(1)\)(合計と個数など定数個の変数のみ。※入力一括読み込み分を除く)

実装のポイント

  • 割り算の前に \(cnt=0\) を必ずチェック(0除算を防ぎ、仕様通り -1 を出す)。

  • 平均は誤差許容があるので、{:.10f} のように十分な桁数で出力すれば安全です。

  • \(N\) が大きいため、Pythonでは入出力がボトルネックになりがちです。このコードのように sys.stdin.buffer.read() + 自前パーサで高速に整数を読むと安定します。

    ソースコード

import sys

data = sys.stdin.buffer.read()
n = len(data)
idx = 0

def next_int():
    global idx
    while idx < n and data[idx] <= 32:
        idx += 1
    num = 0
    while idx < n and data[idx] > 32:
        num = num * 10 + (data[idx] - 48)
        idx += 1
    return num

N = next_int()
K = next_int()

total = 0
cnt = 0
for _ in range(N):
    s = next_int()
    if s >= K:
        total += s
        cnt += 1

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

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

投稿日時:
最終更新: