B4342 [语言月赛 202506] 火车优惠

· · 题解

Source & Knowledge

2024 年 6 月语言月赛,由洛谷网校入门计划/基础计划提供。

题目大意

小明想乘火车旅行 x 公里。车票价格如下:

小明可以用一张票两张票,票的公里数可以随意拆分,目标是总费用最少。求完成 x 公里所需的最小花费。

题目分析

本题的核心在于两个方面:

  1. 设计单张票的计费方法
  2. 在所有一张票或两张票的拆分方式中,枚举求出总费用的最小值

单张票计费方法

我们首先仅考虑一张票,计算长度为 d 公里的单张车票价格:

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;

枚举所有可能拆分方式

在明确一张票的计算方式后,我们可以自然地枚举 0 \le i \le x,设第一张票走 i 公里,第二张票走 x - i 公里(可为 0 公里)。对于每一组划分,计算 i 公里的费用和 x - i 公里的费用的总和。

在上述的所有总和中取最小值,即为答案,最终输出即可。