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\) 度ずつ減らすループ)方法でも動きそうですが、問題の本質は「差分を数える」だけなので、直接計算するのが簡潔で確実です。
アルゴリズム
- 各温度 \(T_i\) を文字列で受け取り、\(0.1\) 度単位の整数 \(v\)(= 温度 \(\times 10\))に変換する。
- 例:
"40.3"なら \(403\)
- 例:
- しきい値 \(37.0\) 度も同様に \(370\) として扱う。
- 各部屋について、もし \(v > 370\) なら超過分 \(v - 370\) を答えに加算する。
- 合計を出力する。
数式で書くと、部屋 \(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 によって生成されました。
投稿日時:
最終更新: