惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy International News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
O
OpenAI News
Cloudbric
Cloudbric
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
L
Lohrmann on Cybersecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tenable Blog
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
P
Proofpoint News Feed
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
L
LangChain Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东

OneCoder

【GESP】C++二级真题 luogu-B4553 [GESP202606 二级] 完全平方数计数 【GESP】C++一级真题 luogu-B4551 [GESP202606 一级] 去旅行 【GESP】C++一级真题 luogu-B4552 [GESP202606 一级] 交税 【NOIP】2000真题解析 luogu-P1023 税收与补贴问题(适合GESP四、五级以上练习) 【NOIP】2000真题解析 luogu-P1022 计算器的改良(适合GESP四、五级以上练习) 【NOIP】2001真题解析 luogu-P1029 最大公约数和最小公倍数问题 【CSP】CSP-X 2018真题 11的倍数 luogu-B4075 (适合GESP三级及以上考生练习) 【CSP】CSP-X 2018真题 统计成绩 luogu-B4074 (适合GESP二级及以上考生练习) 【CSP】CSP-X 2018真题 小明的照片 luogu-B4072 (适合GESP一级及以上考生练习) 【GESP】C++四级练习 luogu-P1138 第 k 小整数 【NOIP】2008真题解析 luogu-P1125 笨小猴 【信奥业余科普】C++ 的奇妙之旅 29:别让 TLE 和 MLE 偷走你的分——复杂度估算与数据范围速查 【信奥业余科普】C++ 的奇妙之旅 28:规范比赛代码的钥匙——文件操作与输入输出重定向(freopen) 【CSP】CSP-J 2023真题 公路 luogu-P9749 (适合GESP四级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 27:高效处理数据的利器——常用算法库(algorithm) 【CSP】CSP-J 2022真题 解密 luogu-P8814 (适合GESP四级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 26:高效的键值对——映射(map)与多重映射(multimap) 【CSP】CSP-J 2022真题 乘方 luogu-P8813 (适合GESP二级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 25:自动排序的利器——集合(set)与多重集合(multiset) 【CSP】CSP-J 2019真题 纪念品 luogu-P5662 (适合GESP六级及以上考生练习) 【信奥业余科普】C++ 的奇妙之旅 24:拆解 deque——分段连续的双端队列 【信奥业余科普】C++ 的奇妙之旅 23:主动限制的艺术——栈(stack)与队列(queue)
【CSP】CSP-X 2018真题 快递费用 luogu-B4073 (适合GESP二级及以上考生练习)
OneCoder · 2026-06-20 · via OneCoder

CSP-X 2018真题-快递费用,一道结合分支判断与简单数学运算的入门题目,考察条件语句(或数组映射)和向上取整的处理技巧。适合GESP二级及以上考生练习,难度⭐☆。

B4073 [CSP-X 2018] 快递费用

题目要求

题目描述

某快递公司按邮寄物品的重量收费,收费标准如下:

重量在 $500$ 克以内的,一律 $20$ 元;

超过 $500$ 克的,超重的部分按每 $500$ 克加收费用。超出的重量不足 $500$ 克的,按 $500$ 克计算。例如:$1020$ 克,超重 $520$ 克,需加收两份费用。

根据目的地的不同,加收的费用是不一样的。快递公司划分了五个目的地区域:

  • 区域 $1$:每超重 $500$ 克加收 $4$ 元;
  • 区域 $2$:每超重 $500$ 克加收 $6$ 元;
  • 区域 $3$:每超重 $500$ 克加收 $9$ 元;
  • 区域 $4$:每超重 $500$ 克加收 $10$ 元;
  • 区域 $5$:每超重 $500$ 克加收 $17$ 元。

给出物品的重量 $w$ 和目的地区域编号 $n$,请你计算快递费用。

输入格式

一行,两个正整数 $w, n$。

输出格式

一行,一个整数,表示快递费用。

输入输出样例 #1

输入 #1
输出 #1

说明/提示

$1020$ 克的物品寄到区域 $3$,前 $500$ 克收费 $20$ 元;

超重 $1020 - 500 = 520$ 克,还需缴纳 $2$ 份加收的费用;

区域 $3$ 每超重 $500$ 克加收 $9$ 元,共计:$20 + 9 \times 2 = 38$ 元。

数据保证 $1\leq w\leq 10^8$,$1\leq n\leq 5$。


题目分析

本题是一道结合分支判断数学运算的入门题,考察对分段计费规则的理解和实现。

解题思路分析:

  1. 基础费用
    • 无论物品多重,前 $500$ 克的费用固定为 $20$ 元。
    • 如果 $w \leq 500$,直接输出 $20$ 即可。
  2. 超重部分的计算
    • 超出重量为 $w - 500$ 克,设超出重量为 $a = w - 500$。
    • 超出的部分按每 $500$ 克一份来计费,不足 $500$ 克的按 $500$ 克计算。这实际上就是对超重部分 $a$ 除以 $500$ 后做向上取整
    • 向上取整的份数公式为:$\lceil \frac{a}{500} \rceil$。

    向上取整技巧详解:

    C++ 中的整数除法(/)是天然向下取整的,即直接截断小数部分。例如 $520 / 500 = 1$(余数 $20$ 被丢弃)。但本题要求”不足 $500$ 克也按 $500$ 克算”,也就是需要向上取整,即 $520 / 500$ 应该得到 $2$。

    向上取整的通用公式为:

    \[\lceil \frac{a}{b} \rceil = \lfloor \frac{a + b - 1}{b} \rfloor\]

    其原理是:在做除法之前,给被除数加上 $b - 1$(即除数减一)。这样做的效果是——

    • 如果 $a$ 能被 $b$ 整除(即没有余数),加上 $b - 1$ 后仍然不会多凑出一个 $b$,向下取整的结果不变。例如:$a = 1000, b = 500$,则 $(1000 + 499) / 500 = 1499 / 500 = 2$,与 $1000 / 500 = 2$ 结果一致。
    • 如果 $a$ 不能被 $b$ 整除(即有余数),原本余数被截断导致少算了一份,但加上 $b - 1$ 后,余数部分被”顶”过了下一个整除点,向下取整的结果恰好多出 $1$,实现了向上取整。例如:$a = 520, b = 500$,原本 $520 / 500 = 1$,但 $(520 + 499) / 500 = 1019 / 500 = 2$,符合预期。

    在本题中,$a = w - 500$,$b = 500$,代入公式得:

    \[\lceil \frac{w - 500}{500} \rceil = \frac{(w - 500) + 499}{500} = \frac{w - 1}{500}\]

    所以在代码中直接写 (w - 1) / 500 即可。虽然化简后的表达式看上去和”超重部分除以500”没有直接联系了,但它确实是由向上取整公式严格推导而来的。

    这是一个在竞赛和日常编程中非常常用的整数运算技巧,建议牢记。

  3. 区域费率的映射
    • 五个区域对应五种不同的加收单价:$4, 6, 9, 10, 17$。
    • 可以使用 if-else 分支逐一判断,但更简洁优雅的做法是使用数组映射:将五个费率存入数组,用区域编号作为下标直接取值。
  4. 最终费用
    • 总费用 $= 20 + \text{超重份数} \times \text{区域单价}$。
  5. 数据类型注意
    • $w$ 最大可达 $10^8$,超重份数最多约为 $2 \times 10^5$,乘以最大单价 $17$ 后约为 $3.4 \times 10^6$,加上基础费用 $20$ 后远小于 int 的上限,因此使用 int 即可安全存储结果。

复杂度分析:

  • 时间复杂度:$O(1)$,只需常数次运算。
  • 空间复杂度:$O(1)$,只使用几个变量和一个固定大小的数组。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>

int main() {
    int w, n;
    std::cin >> w >> n;

    // 五个区域对应的超重加收单价,下标 1~5 对应区域 1~5
    int rate[] = {0, 4, 6, 9, 10, 17};

    // 基础费用 20 元
    int cost = 20;

    // 如果超重,计算超重份数并加收费用
    if (w > 500) {
        // 向上取整:ceil((w-500)/500) = (w-500+499)/500 = (w-1)/500
        int extra = (w - 1) / 500;
        cost += extra * rate[n];
    }

    std::cout << cost << std::endl;
    return 0;
}


所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP 学习专题站:GESP WIKI

"luogu-"系列题目可在洛谷题库进行在线评测。

"bcqm-"系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号

GESP/CSP 认证学习微信公众号