駐車場の 料金の計算
- 条件分岐
- 問題 04
- やさしい
- 目安 11 分
入庫と
本番の
入力は
問題
長く
料金は、
- d が 30 以下なら、
料金は 0 円です (止めた 時間が 30 分以下の ときだけ 無料です) - d が 30 より
大きい ときは、 入庫した 時刻から 1440 分 (24 時間) ごとに 区切ります。 区切った 1 つ分の 中では、 30 分ごとに 200 円かかります。 30 分に 満たない 端の 時間も 200 円です - 区切った 1 つ分の
料金は、 1500 円を 上限にします。 最後の 区切りが 1440 分より 短い ときも、 その 中で 同じ 数え方をします
たとえば d が 100 分なら、
車ごとの
入力の形式
N
s_1 t_1
s_2 t_2
...
s_N t_N1 行目に
出力の形式
N + 1 行を
制約
- N は、
1 以上 100000 以下の整数です - s_i と t_i は、
0 以上 1000000 以下の整数です - どの
車も、 s_i は t_i より 小さい値です
入力と出力の例
例 1
1 台目は
入力
3 0 20 60 160 1000 2500
出力
0 800 1900 2700
例 2
1 台目は
入力
3 10 40 10 41 0 1440
出力
0 400 1500 1900
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
全部の
先に
解答
d が 30 以下なら 0 円です。
Python
Python
import sys
data = sys.stdin.read().split()
n = int(data[0])
fees = []
for i in range(n):
s = int(data[1 + 2 * i])
t = int(data[2 + 2 * i])
d = t - s
if d <= 30:
fee = 0
else:
days, rest = divmod(d, 1440)
fee = days * 1500 + min(1500, (rest + 29) // 30 * 200)
fees.append(fee)
lines = [str(fee) for fee in fees]
lines.append(str(sum(fees)))
print("\n".join(lines))JavaScript
JavaScript
const data = require("fs").readFileSync(0, "utf8").split(/\s+/).filter(Boolean).map(Number);
const n = data[0];
const lines = [];
let total = 0;
for (let i = 0; i < n; i++) {
const d = data[2 + 2 * i] - data[1 + 2 * i];
let fee = 0;
if (d > 30) {
const days = Math.floor(d / 1440);
const rest = d % 1440;
fee = days * 1500 + Math.min(1500, Math.ceil(rest / 30) * 200);
}
lines.push(fee);
total += fee;
}
lines.push(total);
console.log(lines.join("\n"));計算量
1 台の
遅い
よく ある間違い
- 30 分の
区切りを 切り上げずに 切り捨てて、 31 分を 200 円に してしまう。 端の 時間も 200 円です - 「30 分まで無料」を、どの
車でも 最初の 30 分を 引いてから 数えると 読んでしまう。 無料に なるのは 止めた 時間が 30 分以下の ときだけで、 31 分なら 最初から 数えて 400 円です - 上限の 1500 円を、
24 時間ごとではなく 全体に 1 回だけ 当てはめてしまう。 2 日止めた車は 3000 円です - ちょうど 1440 分の
車を、 上限 1500 円に 加えて 余り 0 分の 区切りを 1 つ 数え、 1700 円に してしまう。 余りが 0 なら 区切りは 0 個です
解答を動かした版 Python 3.12.14Node.js 22.23.4確認日 2026/10/31