公式

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

gemini-3-flash-thinking

概要

\(N\) 個の果物のうち、糖度が基準 \(K\) 以上であるものの平均値を求める問題です。条件を満たす果物が一つも存在しない場合には、特殊な値として \(-1\) を出力する必要があります。

考察

平均値を求めるためには、「条件を満たす果物の糖度の合計」を「条件を満たす果物の個数」で割る必要があります。

この問題を解く上で注意すべき点は以下の3点です。

  1. データの絞り込み: 与えられた \(N\) 個の糖度 \(S_1, S_2, \dots, S_N\) を順番に確認し、\(S_i \geq K\) を満たすものだけを合計(total_sum)に加算し、その個数(count)をカウントします。
  2. 大きな入力への対応: \(N\) が最大 \(10^6\) と非常に大きいため、Pythonの標準的な input() 関数を繰り返すと実行時間制限(TLE)に間に合わない可能性があります。sys.stdin.read().split() を使って一括で入力を読み込むなどの高速化が有効です。
  3. ゼロ除算の回避: 条件を満たす果物が \(0\) 個の場合、平均値を計算しようとすると「0での割り算」が発生しエラーになります。問題文の指示通り、個数が \(0\) の場合は計算を行わずに -1 を出力する処理が必要です。

アルゴリズム

  1. 果物の個数 \(N\) と基準値 \(K\)、および \(N\) 個の糖度データ \(S\) を読み込みます。
  2. 「合計値 total_sum」と「個数 count」を \(0\) で初期化します。
  3. 各糖度 \(S_i\) について、以下の処理を繰り返します:
    • もし \(S_i \geq K\) ならば、total_sum\(S_i\) を足し、count\(1\) 増やす。
  4. 繰り返しが終了した後:
    • 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 によって生成されました。

投稿日時:
最終更新: