Official

A - エアコンの温度調整 / Air Conditioner Temperature Adjustment Editorial by admin

gemini-3-flash-preview

概要

\(N\) 個の部屋の温度 \(T_i\) をすべて \(37.0\) 度以下にするために、温度を \(0.1\) 度下げる操作を合計で何回行う必要があるかを求める問題です。

考察

この問題を解くにあたって、最も注意すべき点は浮動小数点数の精度誤差です。

コンピュータ内部では小数を 2 進数で管理しているため、0.1 という値は正確に表現できず、わずかな誤差が生じることがあります。例えば、37.1 - 37.0 を計算した結果が 0.1 ちょうどにならず、0.09999999999999432 のような値になってしまうことがあります。このような誤差を含んだまま割り算や比較を行うと、答えが \(1\) 減ってしまったりする原因(WA: Wrong Answer)になります。

今回の問題では、すべての温度 \(T_i\) が「小数第 1 位まで」と決まっています。そこで、すべての値を 10 倍して整数として扱うことで、誤差を完全に排除して計算することができます。

  • 目標温度: \(37.0 \times 10 = 370\)
  • 操作 1 回あたりの変化量: \(0.1 \times 10 = 1\)
  • 各部屋の温度: \(T_i \times 10\)

このように変換すると、ある部屋の温度 \(T_i\) が \(37.0\) 度より高い場合、必要な操作回数は整数同士の引き算 (T_i を 10 倍した整数) - 370 で正確に求めることができます。

アルゴリズム

  1. 合計操作回数を表す変数 total_operations を \(0\) で初期化します。
  2. 各部屋の温度 \(T_i\) について、以下の処理を繰り返します。
    • \(T_i\) を 10 倍して整数に変換した値を \(T_{scaled}\) とします。
    • もし \(T_{scaled} > 370\) ならば、その差分 T_scaled - 370 を total_operations に加算します。
  3. 最終的な total_operations を出力します。

計算量

  • 時間計算量: \(O(N)\)
    • 部屋の数 \(N\) に対して、各部屋の温度を 1 回ずつ確認するため、部屋の数に比例した時間で計算が終わります。\(N \leq 2 \times 10^5\) なので、十分に高速です。
  • 空間計算量: \(O(N)\)
    • 入力されたすべての温度をリスト等に保持する場合、\(N\) に比例したメモリを使用します。

実装のポイント

  • 小数の整数化: Python で int(float(s) * 10) とすると、誤差によって 37.1 が 370 になってしまう可能性があります。これを防ぐために、round(float(s) * 10) を使って四捨五入してから整数型に変換するのが安全です。

  • 高速な入力: \(N\) が最大 \(2 \times 10^5\) と大きいため、sys.stdin.read().split() などを用いて一括で入力を取得することで、実行時間を短縮できます。

    ソースコード

import sys

def solve():
    # 標準入力からすべてのデータを読み込み、空白(スペースや改行)で分割します。
    # これにより、N と各温度 Ti を効率的に取得できます。
    input_data = sys.stdin.read().split()
    
    if not input_data:
        return
    
    # 1番目の要素は部屋の数 N です。
    n = int(input_data[0])
    
    # 必要な操作の合計回数を保持する変数です。
    total_operations = 0
    
    # 2番目以降の要素(各部屋の温度 Ti)を順番に処理します。
    for i in range(1, n + 1):
        # 温度は小数第1位まで与えられるため、浮動小数点の精度問題を避けるために
        # 10倍して整数として扱います。
        # float() で変換した後、10倍し、round() で丸めることで正確な整数値を得ます。
        # 例: 37.1度 -> 371, 37.0度 -> 370
        t_scaled = int(round(float(input_data[i]) * 10))
        
        # 37度(整数スケールで370)より高い場合、その差分が操作回数となります。
        if t_scaled > 370:
            total_operations += (t_scaled - 370)
            
    # 合計回数を整数で出力します。
    print(total_operations)

if __name__ == '__main__':
    solve()

この解説は gemini-3-flash-preview によって生成されました。

posted:
last update: