公式
A - 果物の選別 / Fruit Sorting 解説 by admin
gemini-3-flash-thinking概要
\(N\) 個の果物のうち、糖度が基準 \(K\) 以上であるものの平均値を求める問題です。条件を満たす果物が一つも存在しない場合には、特殊な値として \(-1\) を出力する必要があります。
考察
平均値を求めるためには、「条件を満たす果物の糖度の合計」を「条件を満たす果物の個数」で割る必要があります。
この問題を解く上で注意すべき点は以下の3点です。
- データの絞り込み:
与えられた \(N\) 個の糖度 \(S_1, S_2, \dots, S_N\) を順番に確認し、\(S_i \geq K\) を満たすものだけを合計(
total_sum)に加算し、その個数(count)をカウントします。 - 大きな入力への対応:
\(N\) が最大 \(10^6\) と非常に大きいため、Pythonの標準的な
input()関数を繰り返すと実行時間制限(TLE)に間に合わない可能性があります。sys.stdin.read().split()を使って一括で入力を読み込むなどの高速化が有効です。 - ゼロ除算の回避:
条件を満たす果物が \(0\) 個の場合、平均値を計算しようとすると「0での割り算」が発生しエラーになります。問題文の指示通り、個数が \(0\) の場合は計算を行わずに
-1を出力する処理が必要です。
アルゴリズム
- 果物の個数 \(N\) と基準値 \(K\)、および \(N\) 個の糖度データ \(S\) を読み込みます。
- 「合計値
total_sum」と「個数count」を \(0\) で初期化します。 - 各糖度 \(S_i\) について、以下の処理を繰り返します:
- もし \(S_i \geq K\) ならば、
total_sumに \(S_i\) を足し、countを \(1\) 増やす。
- もし \(S_i \geq K\) ならば、
- 繰り返しが終了した後:
countが \(0\) であれば、-1を出力します。countが \(1\) 以上であれば、total_sum / countを計算して出力します。
計算量
- 時間計算量: \(O(N)\) \(N\) 個のデータを一度ずつ走査するため、入力サイズに比例した時間で計算が終わります。\(N=10^6\) であっても、十分に制限時間内に間に合います。
- 空間計算量: \(O(N)\) 入力を一括で読み込んでリストに保持する場合、 \(N\) 個の要素をメモリに格納するため \(O(N)\) の空間が必要になります。
実装のポイント
高速な入出力: Pythonでは
sys.stdin.read().split()を用いることで、大量の数値を高速にリストとして取得できます。精度: Pythonの浮動小数点数(
float型)は内部的にC言語のdouble精度相当であり、本問題の要求精度(相対誤差 \(10^{-6}\) 以下)を十分に満たすことができます。大きな数値: 合計値
total_sumは最大で \(10^6 \times 10^9 = 10^{15}\) 程度になりますが、Pythonは整数(int型)の桁数制限が自動で拡張されるため、オーバーフローを気にする必要はありません。ソースコード
import sys
def solve():
# 全ての入力を一度に読み込み、空白(スペースや改行)で分割してトークンのリストを作成します。
# N=10^6 程度の入力であれば、この方法がPythonにおいて高速です。
input_data = sys.stdin.read().split()
# 入力が空の場合や不足している場合は終了します。
if len(input_data) < 2:
return
# 最初の2つのトークンは果物の個数 N と出荷基準の糖度 K です。
n = int(input_data[0])
k = int(input_data[1])
# 出荷基準を満たす果物の糖度の合計と個数を管理します。
total_sum = 0
count = 0
# 糖度のリストは input_data[2] から input_data[n+1] までです。
# map(int, ...) を使用して一括で整数に変換しながらループを回します。
# スライス input_data[2:2+n] を用いることで正確に N 個のデータを取得します。
for s in map(int, input_data[2:2+n]):
if s >= k:
total_sum += s
count += 1
# 出荷できる果物が1つもない場合は -1 を出力します。
if count == 0:
print("-1")
else:
# 平均値を計算して出力します。
# Pythonの浮動小数点数(double精度)は十分な精度(約15〜17桁)を持っており、
# 相対誤差 10^-6 以下の要求を満たすことができます。
print(total_sum / count)
if __name__ == "__main__":
solve()
この解説は gemini-3-flash-thinking によって生成されました。
投稿日時:
最終更新: