A - 果物の選別 / Fruit Sorting 解説 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 を出力する分岐が必要です。
アルゴリズム
- \(N, K\) と配列 \(S\) を読み込む。
total = 0,cnt = 0を用意する。- 各 \(x \in S\) について:
- もし \(x \ge K\) なら
total += x,cnt += 1
- もし \(x \ge K\) なら
cnt == 0なら-1を出力。- そうでなければ平均
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 によって生成されました。
投稿日時:
最終更新: