B4342 [语言月赛 202506] 火车优惠
Source & Knowledge
2024 年 6 月语言月赛,由洛谷网校入门计划/基础计划提供。
题目大意
小明想乘火车旅行
- 前
1 \sim 10 公里,每公里20 元; - 超过
10 公里至50 公里部分,每5 公里80 元(不足5 公里也按5 公里计算); - 超过
50 公里部分,每10 公里120 元(不足10 公里也按10 公里计算)。
小明可以用一张票或两张票,票的公里数可以随意拆分,目标是总费用最少。求完成
题目分析
本题的核心在于两个方面:
- 设计单张票的计费方法;
- 在所有一张票或两张票的拆分方式中,枚举求出总费用的最小值。
单张票计费方法
我们首先仅考虑一张票,计算长度为
- 前
10 公里按每公里20 元计费; - 若
d > 10 ,其超出部分最多至50 公里部分,分为若干个5 公里段,不足5 公里部分按5 公里算,每段收费80 元; - 若
d > 50 ,其超出部分继续按照每10 公里120 元计费,若不足10 公里也按10 公里计费。
int money = 0;
money += 20 * min(d, 10);
d -= min(d, 10);
int per5km = min(d, 50 - 10) / 5;
if (min(d, 50 - 10) % 5 != 0) {
per5km++;
}
money += 80 * per5km;
d -= min(d, 50 - 10);
int per10km = d / 10;
if (d % 10 != 0) {
per10km++;
}
money += 120 * per10km;
枚举所有可能拆分方式
在明确一张票的计算方式后,我们可以自然地枚举
在上述的所有总和中取最小值,即为答案,最终输出即可。