Official
A - エアコンの温度調整 / Air Conditioner Temperature Adjustment Editorial
by
A - エアコンの温度調整 / Air Conditioner Temperature Adjustment Editorial
by
MMNMM
初心者の方へ
- AtCoder をはじめたばかりで何をしたらよいか分からない方は、まずは practice contest の問題A「Welcome to AtCoder」を解いてみてください。基本的な入出力の方法が載っています。
- また、プログラミングコンテストの問題に慣れていない方は、AtCoder Beginners Selection の問題をいくつか解いてみることをおすすめします。
- C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラミングのための C++ 入門用コンテンツです。
- Python入門 AtCoder Programming Guide for beginners (APG4bPython) は、競技プログラミングのための Python 入門用コンテンツです。
この問題は、それぞれの部屋ごとに必要な操作の回数を求め、それらの合計を計算することで解くことができます。
現在の温度が \(T _ i\) である部屋に対して必要な操作は \(10\times(\max\lbrace T _ i,37\rbrace-37)\) 回です。 \(T _ i\) は小数点以下第一位まで与えられ、操作の回数は整数で出力する必要があります。 よって、入力からある部分までは浮動小数点数で、それ以降から出力までは整数で処理を行うことになるでしょう。
どこから整数で処理するかは(この問題では)かなり自由に決めることができます。 例えば以下のような形にすることができます。
- 入力の時点で整数 \(10T _ i\) を計算し、この値をもとにあとの計算を行う。
- 浮動小数点数を扱う区間をなるべく短くする方針です。\(10T _ i\) の計算は、入力された文字列から
.を取り除いて整数値を得ることもできますし、この部分だけ浮動小数点数を使いround(10 * T)のように求めても正しい値が得られることが証明できます。
- 浮動小数点数を扱う区間をなるべく短くする方針です。\(10T _ i\) の計算は、入力された文字列から
- \(10\times(\max\lbrace T _ i,37\rbrace-37)\) を計算した値を整数に直し、合計は整数で行う。
- 浮動小数点数を扱う区間は短くしたいが式の変形をしたくないような方針です。これくらいの規模の式(と値の制約)なら、十分な精度の浮動小数点数を使って計算し、四捨五入して整数に直すことで正しい値が得られることが証明しやすいです。
- 合計まで浮動小数点数で行い、出力する際に整数に直す。
- 2. の方針と比べて少し証明のステップが増えますが、こちらも十分な精度の浮動小数点数を使って計算したあと四捨五入して整数に直すことで正しい値が得られることが証明できます。
実装例は以下のようになります。 C++ の実装例では 1. の方針を、Python の実装例では 3. の方針をとっています。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int N;
cin >> N;
int ans = 0;
for (int i = 0; i < N; ++i) {
double T;
cin >> T; // 小数を読み込んで
// 10 倍して四捨五入した整数をもとに計算
// 10 * (max(T, 37) - 37) = max(10 * T, 370) - 370
ans += max(static_cast<int>(round(10 * T)), 370) - 370;
}
cout << ans << endl;
return 0;
}
N = int(input())
# 小数のまま合計まで計算して、最後に四捨五入
print(round(sum(10 * (max(p, 37) - 37) for p in map(float, input().split()))))
posted:
last update:
