计算邮资

GitHub跳转原题关系图返回列表

按重量分段计费: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;
}