top1编程
← 返回题目
题解

公园门票收费系统

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4311 公园门票收费系统(【入门】)

    解题思路

    门票原价每人 45 元,买的人越多越便宜。价格分四个档:

    • 人数 ≥ 30:每人减 10 元,单价 35 元;
    • 20 ≤ 人数 < 30:每人减 5 元,单价 40 元;
    • 10 ≤ 人数 < 20:每人减 2 元,单价 43 元;
    • 人数 < 10:没有优惠,单价 45 元。

    总花费 = 人数 × 单价。所以关键是把单价算对,再乘人数。

    判断的时候要从大到小判断:先看是否 ≥30,再看是否 ≥20,再看是否 ≥10。因为 if...else if 是"第一个满足就不看后面的",从大到小判断可以保证人数落在正确的档位。比如人数 25,先检查 n>=30 不成立,再检查 n>=20 成立,单价定为 40,不会落到 43 那一档。

    拿样例来说,人数 10 属于"10≤人数<20"这一档,单价 43 元,总花费 10×43=43010\times43=430 元。

    边界情况:人数为 1 时单价 45,总花费 45;人数为 500 时单价 35,总花费 500×35=17500500\times35=17500,用 int 完全装得下。

    参考代码

    // 根据购票人数计算团体票总花费
    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int p = 45;                 // 单价,先按原价算
        if (n >= 30) p = 35;        // 30人及以上每人减10元
        else if (n >= 20) p = 40;   // 20~29人每人减5元
        else if (n >= 10) p = 43;   // 10~19人每人减2元
        // 10人以下保持原价45元
        cout << n * p << endl;
        return 0;
    }
    

    复杂度分析

    最多判断 4 次就确定了单价,无论人数多少,都只做固定几次运算,所以时间复杂度是 O(1)O(1)。只用了两个整数变量,额外空间复杂度也是 O(1)O(1)。

    • 1