Official
A - 果物の選別 / Fruit Sorting Editorial 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() で一括読み込みして整数をパースしています。
アルゴリズム
- \(total=0\)(出荷可能な糖度の合計)、\(cnt=0\)(出荷可能な個数)を用意する。
- \(i=1..N\) について糖度 \(S_i\) を読む。
- もし \(S_i \\ge K\) なら、\(total \\leftarrow total + S_i\)、\(cnt \\leftarrow cnt + 1\)。
- 走査後、
- \(cnt=0\) なら
-1を出力。 - そうでなければ平均 \(total/cnt\) を十分な精度で出力する(このコードでは小数点以下10桁)。
- \(cnt=0\) なら
計算量
- 時間計算量: \(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 によって生成されました。
posted:
last update: