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 で正確に求めることができます。
アルゴリズム
- 合計操作回数を表す変数
total_operationsを \(0\) で初期化します。 - 各部屋の温度 \(T_i\) について、以下の処理を繰り返します。
- \(T_i\) を 10 倍して整数に変換した値を \(T_{scaled}\) とします。
- もし \(T_{scaled} > 370\) ならば、その差分
T_scaled - 370をtotal_operationsに加算します。
- 最終的な
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: