公式

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

GPT 5.2 High

概要

各部屋の温度 \(T_i\) が \(37\) 度を超えている分だけ、\(0.1\) 度刻みで下げる操作回数を合計する問題です。

考察

1回の操作で温度を \(0.1\) 度下げられるので、ある部屋の温度が \(37\) 度を超えているとき、必要な操作回数は「超過分を \(0.1\) で割った回数」です。
例えば \(37.2\) 度なら \(0.2\) 度下げる必要があるので \(0.2 / 0.1 = 2\) 回です。

ここで注意したいのが 小数の扱いです。素朴に float で計算すると、内部表現の誤差により - 本当は \(37.1 - 37.0 = 0.1\) のはずが \(0.099999...\) になる
などが起き、切り上げ・切り捨ての判断で WA につながることがあります。

この問題では入力が「小数第1位まで」と決まっているため、温度を 10倍して整数(0.1度単位) に直すのが安全です。
- \(37.2 \rightarrow 372\) - \(36.9 \rightarrow 369\)

すると、必要操作回数は単に - \(v > 370\) のとき \(v - 370\) - それ以外は \(0\) を足し合わせるだけになります。

また、操作を1回ずつシミュレーションする(\(0.1\) 度ずつ減らすループ)方法でも動きそうですが、問題の本質は「差分を数える」だけなので、直接計算するのが簡潔で確実です。

アルゴリズム

  1. 各温度 \(T_i\) を文字列で受け取り、\(0.1\) 度単位の整数 \(v\)(= 温度 \(\times 10\))に変換する。
    • 例: "40.3" なら \(403\)
  2. しきい値 \(37.0\) 度も同様に \(370\) として扱う。
  3. 各部屋について、もし \(v > 370\) なら超過分 \(v - 370\) を答えに加算する。
  4. 合計を出力する。

数式で書くと、部屋 \(i\) の操作回数は
$\( \max(0, 10T_i - 370) \)\( (ただし \)10T_i$ は整数化した値)です。

計算量

  • 時間計算量: \(O(N)\)(各部屋を1回ずつ処理するだけ)
  • 空間計算量: \(O(1)\)(合計値など定数個の変数のみ。入力全体を読む実装でも追加は定数レベル)

実装のポイント

  • 浮動小数点を使わない:入力が小数第1位までなので、文字列から直接「10倍した整数」に変換すると誤差が出ません。

    • コードの to_tenths は "a.b" を a*10 + b にして安全に処理しています。
  • しきい値 \(37.0\) 度は \(370\)(0.1度単位)として比較し、超過分だけ ans += v - 370 とします。

  • 入力が最大 \(2 \times 10^5\) 個なので、sys.stdin.buffer.read() でまとめて読むと高速です。

    ソースコード

import sys

def to_tenths(s: str) -> int:
    if '.' in s:
        a, b = s.split('.', 1)
        return int(a) * 10 + int(b[0])
    return int(s) * 10

def main():
    data = sys.stdin.buffer.read().split()
    if not data:
        return
    n = int(data[0])
    temps = data[1:1+n]
    ans = 0
    for t in temps:
        v = to_tenths(t.decode())
        if v > 370:
            ans += v - 370
    print(ans)

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

投稿日時:
最終更新: