1 条题解
-
0
行李托运价格
一个自然的想法
收费标准分两段:不超过 10 公斤收 2.5 元;超过 10 公斤的部分,每公斤加收 1.5 元。这是最典型的分段函数,写法就是一问一答:
- 重量 w ≤ 10:费用 = 2.5
- 重量 w > 10:费用 = 2.5 + (w − 10) × 1.5
突破口:分段点归谁
写分段函数时最纠结的往往是:恰好等于 10 公斤归哪一段?按题意"10 公斤或10 公斤以下"收 2.5 元,所以 10 归前一段。代码里写
if (w <= 10),边界就锁住了。另一个小坑在输出的类型:费用 2.5 不是整数,输入的重量是整数,但计算结果必须用浮点。C 语言里如果写
2.5 + (w - 10) * 1.5,w 是 int 也没关系——和浮点常量运算时会自动转成 double,这个规则叫"隐式类型转换"。代码实现
#include <stdio.h> int main() { int w; scanf("%d", &w); double fee; if (w <= 10) fee = 2.5; else fee = 2.5 + (w - 10) * 1.5; printf("%.2f\n", fee); /* 保留两位小数 */ return 0; }用样例验证:w = 10,走前一段,费用 2.5,按
%.2f输出2.50✓。再算一组:w = 15,2.5 + 5 × 1.5 = 10.00 ✓。容易出错的细节
- 输出格式是
%.2f:保留两位小数,2.5 必须输出成2.50。直接%f会输出2.500000,对不上。 - 边界 10 归第一段:写成
w < 10的话,输入 10 会被算成 2.5 + 0 × 1.5 = 2.50,数值恰好相同侥幸过关——但把分段条件写清是原则问题,换一道超重首价更高的题就会错。 - 累加段写法:
fee = 2.5 + (w - 10) * 1.5,注意是"超过的部分"乘单价,不要把前 10 公斤也乘进去。
复杂度
时间与空间复杂度均为 O(1)。
这题的本质:分段函数的代码翻译。找分段点、明确边界归哪一段、选好输出格式——计费类题目(出租车、水电费、邮资)全是这个模式。
信息
- ID
- 1734
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 3
- 上传者