top1编程
← 返回题目
题解

【入门】公交卡充值问题

1 条题解

  • 0
    @ 2026-8-1 9:36:51

    解题思路

    这道题是一个“按区间送礼物”的问题:你充值多少钱,公司根据你充的金额,决定额外送你多少钱。送得越多,到账的钱就越多。

    先把赠送规则看懂

    把规则整理成一张小表:

    充值金额 n 赠送金额 到账金额
    200 ~ 299 元 50 元 n + 50
    300 ~ 499 元 100 元 n + 100
    500 元及以上 200 元 n + 200
    200 元以下 0 元 n(没有变化)

    注意看:规则里写的都是“充值 200~299 元、300~499 元、500 元及以上”,也就是说 200、300、500 这几个分界点本身都是“含”的(>= 包含)。

    多举几个例子找感觉

    例 1:充 350 元。350 在 300~499 这个区间里,所以赠送 100 元,到账 350 + 100 = 450 元。(题目里的例子)

    例 2:充 150 元。150 不到 200,属于“200 元以下”,什么都不送,到账 150 元。

    例 3:充 520 元。520 大于等于 500,属于“500 元及以上”,赠送 200 元,到账 520 + 200 = 720 元。

    例 4:充 200 元。200 正好卡在分界点上,它属于“200~299 元”这个区间(因为规则说 200 元就送),所以送 50 元,到账 200 + 50 = 250 元,也就是样例的答案。

    判断顺序为什么重要

    题目给了四个区间,我们用 if / else if 从上往下判断:先问“是不是 500 及以上?”,再问“是不是 300 及以上?”,再问“是不是 200 及以上?”。

    这样做的好处是:每回答一个“是”,就知道它落在最大的那个赠送档位里,不用再继续往下判断了。比如 n = 520,第一个判断就命中了,直接 +200 结束。

    还有一个更聪明的写法:因为区间是连续的(>= 500、>= 300、>= 200),我们可以让程序“自动过滤”。先判断 n >= 500,如果不是,说明 n < 500,那么再判断 n >= 300 时,能进这个分支的一定落在 300~499 之间;同理再判断 n >= 200 时,进分支的一定在 200~299 之间。三个区间正好严丝合缝,不多不少。

    边界情况要特别小心

    • n = 199 和 n = 200:一个是 199,无赠送到账 199;一个是 200,到账 250。差 1 块钱,结果差 50 元。
    • n = 299 和 n = 300:一个是 299,到账 349;一个是 300,到账 400。
    • n = 499 和 n = 500:一个是 499,到账 599;一个是 500,到账 700。

    这些“差一点点”的用例最容易出错,做题的时候一定要在草稿纸上把每个分界点前后各试一次。

    参考代码

    #include <iostream>  // 用于 cin/cout 输入输出
    using namespace std;
    
    int main() {
        // n: 充值金额,ans: 实际到账金额
        int n, ans;
    
        // 读入用户充值的金额
        cin >> n;
    
        // 先认为没有赠送,到账金额就是充值金额
        ans = n;
    
        // 按金额分区间判断送多少钱
        if (n >= 500) {
            // 充值 500 元及以上,赠送 200 元
            ans = ans + 200;
        } else if (n >= 300) {
            // 充值 300~499 元,赠送 100 元
            ans = ans + 100;
        } else if (n >= 200) {
            // 充值 200~299 元,赠送 50 元
            ans = ans + 50;
        }
        // 充值 200 元以下,无赠送,ans 保持原值
    
        // 输出实际到账金额
        cout << ans << endl;
    
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(1)。不管 n 有多大(题目里最大到 999),程序都只做一次判断,然后立刻输出结果,和 n 的大小没有关系。
    • 空间复杂度:O(1)。只用了一个普通整数变量存答案,没有开数组,空间占用恒定。

    小结

    这道题考察的就是“多分支判断”和“区间边界的把握”。只要把四个区间用 if / else if 从大到小排好,注意 200、300、500 这些分界点都是 >=(包含),就能一次做对。下次遇到“按区间给优惠”的题目,都可以用同样的思路:先列区间表,再想清楚每个分界点归谁。

    • 1