公式

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

Claude 4.5 Opus

概要

各部屋の温度を確認し、\(37\) 度より高い部屋について、\(37\) 度まで下げるのに必要な操作回数(\(0.1\) 度下げる操作の回数)の合計を求める問題です。

考察

重要な気づき

  1. 条件の整理: 温度が \(37\) 度以下の部屋は何もしなくてよい。\(37\) 度より高い部屋だけを処理すればよい。

  2. 操作回数の計算: ある部屋の温度が \(T_i\) 度で、\(37\) 度まで下げたいとき、温度差は \(T_i - 37\) 度。\(1\) 回の操作で \(0.1\) 度下がるので、必要な操作回数は: $\(\text{操作回数} = \frac{T_i - 37}{0.1} = (T_i - 37) \times 10\)$

  3. 具体例: 温度が \(38.5\) 度の部屋の場合

    • 温度差: \(38.5 - 37 = 1.5\) 度
    • 操作回数: \(1.5 \times 10 = 15\) 回

素朴なアプローチの問題点

この問題では、単純に各部屋について操作回数を計算して合計するだけで十分です。\(N \leq 2 \times 10^5\) なので、\(O(N)\) のアルゴリズムで十分間に合います。

ただし、浮動小数点数の扱いには注意が必要です。例えば 0.1 * 3 が 0.30000000000000004 のようになることがあり、単純に計算すると誤差が生じる可能性があります。

アルゴリズム

  1. 各部屋の温度 \(T_i\) について順に処理する
  2. \(T_i > 37\) の場合のみ:
    • 温度差 \(\text{diff} = T_i - 37\) を計算
    • 操作回数 \(= \text{diff} \times 10\) を計算(四捨五入で整数化)
    • 合計に加算
  3. 最終的な合計を出力

計算量

  • 時間計算量: \(O(N)\)(各部屋について定数時間の計算を行う)
  • 空間計算量: \(O(N)\)(温度のリストを保存するため)

実装のポイント

浮動小数点数の誤差対策

浮動小数点数の計算では誤差が発生することがあります。例えば:

>>> 38.5 - 37
1.4999999999999964  # 本当は 1.5 になってほしい

このため、単純に int(diff * 10) とすると 14 になってしまう可能性があります。

解決策: round() 関数を使って四捨五入することで、浮動小数点誤差を吸収します。

operations = round(diff * 10)  # 1.4999... * 10 = 14.999... → 15 に四捨五入

別解:整数で計算する方法

浮動小数点誤差を完全に避けたい場合、入力を \(10\) 倍した整数として扱う方法もあります。

# 例: "38.5" → 385 として扱う
# 37度 → 370
# 操作回数 = 385 - 370 = 15

ソースコード

N = int(input())
T = list(map(float, input().split()))

total_operations = 0
for t in T:
    if t > 37.0:
        # 温度差を計算し、0.1度単位での操作回数を求める
        diff = t - 37.0
        # 浮動小数点の誤差を考慮して四捨五入
        operations = round(diff * 10)
        total_operations += operations

print(total_operations)

この解説は claude4.5opus によって生成されました。

投稿日時:
最終更新: