1 条题解

  • 0
    @ 2026-10-8 21:09:26

    行李托运价格

    一个自然的想法

    收费标准分两段:不超过 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 ✓。

    容易出错的细节

    1. 输出格式是 %.2f:保留两位小数,2.5 必须输出成 2.50。直接 %f 会输出 2.500000,对不上。
    2. 边界 10 归第一段:写成 w < 10 的话,输入 10 会被算成 2.5 + 0 × 1.5 = 2.50,数值恰好相同侥幸过关——但把分段条件写清是原则问题,换一道超重首价更高的题就会错。
    3. 累加段写法:fee = 2.5 + (w - 10) * 1.5,注意是"超过的部分"乘单价,不要把前 10 公斤也乘进去。

    复杂度

    时间与空间复杂度均为 O(1)。

    这题的本质:分段函数的代码翻译。找分段点、明确边界归哪一段、选好输出格式——计费类题目(出租车、水电费、邮资)全是这个模式。

    • 1

    信息

    ID
    1734
    时间
    1000ms
    内存
    16MiB
    难度
    10
    标签
    递交数
    4
    已通过
    3
    上传者