按重量分段计费:1000克内基本费8元,超重部分每500克向上取整加收4元,加急再加5元。
OJ: roj
题目 ID: 1052
难度:入门
标签:模拟分段计费
创建: 2026-09-29 16:21
更新: 2026-10-04 23:37
题目描述
根据邮件重量和是否加急计算邮资:1000 克及以内基本费 8 元;超过 1000 克的部分每 500 克加收 4 元,不足 500 克按 500 克计算;加急再多收 5 元。输入一行整数和一个字符 y/n,输出总邮资。
思路
直接按规则分段计算:超重部分用 (e + 499) / 500 实现按 500 克向上取整,避免浮点数;加急时再额外加 5 元。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 16:21
# update_at: 2026-09-29 16:21
import sys
BASE_WEIGHT = 1000 # 基本费对应的重量上限(克)
BASE_FEE = 8 # 基本费(元)
UNIT_EXTRA = 500 # 超重计费单元(克)
FEE_PER_UNIT = 4 # 每个超重单元加收费用(元)
URGENT_FEE = 5 # 加急费(元)
def postage(weight: int, urgent: bool) -> int:
"""按重量与是否加急计算邮资。"""
extra_units = max(weight - BASE_WEIGHT, 0) + (UNIT_EXTRA - 1) # 不足 500g 向上取整
extra_fee = extra_units // UNIT_EXTRA * FEE_PER_UNIT
return BASE_FEE + extra_fee + (URGENT_FEE if urgent else 0)
def solve() -> None:
data = iter(sys.stdin.buffer.read().split())
weight = int(next(data)) # 第一个 token 是重量
urgent = next(data) == b'y' # 第二个 token 是加急标志字符
print(postage(weight, urgent))
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-04 23:37
* update_at: 2026-10-04 23:37
*/
#include <iostream>
using namespace std;
typedef long long ll;
ll w; // 邮件重量(克)
char ch; // 是否加急:y/n
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> w >> ch;
ll ans = 8; // 基本费
if (w > 1000) {
ll e = w - 1000; // 超重部分
ll units = (e + 499) / 500; // 每 500 克向上取整
ans += units * 4; // 超重费
}
if (ch == 'y') ans += 5; // 加急费
cout << ans << "\n";
return 0;
}