【入门】公交卡充值问题
1 条题解
-
0
解题思路
这道题是一个“按区间送礼物”的问题:你充值多少钱,公司根据你充的金额,决定额外送你多少钱。送得越多,到账的钱就越多。
先把赠送规则看懂
把规则整理成一张小表:
充值金额 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