top1编程
← 返回题目
题解

邮件分类

1 条题解

  • 0
    @ 2026-8-5 1:08:04

    解题思路

    邮政编码是6位数,比如北京的邮编前两位是 10,上海是 20,天津是 30。

    这道题的关键是:怎么取出6位数邮编的前两位?

    用除法就行!邮编 101400,除以 10000: 101400 / 10000 = 10(商是10,去掉后4位)。

    所以:

    • 邮编 / 10000 == 10 就是北京;
    • 邮编 / 10000 == 20 就是上海;
    • 邮编 / 10000 == 30 就是天津。

    做法:准备三个"袋子"(数组):

    • b 放北京的邮编,bs 记录放了多少个;
    • s 放上海的邮编,ss 记录个数;
    • t 放天津的邮编,ts 记录个数。

    读入一封邮编,判断它是哪个城市的,就放进哪个袋子。最后按"北京→上海→天津"的顺序,把三个袋子依次倒出来输出。

    注意输出格式:每个城市先输出城市名那一行,再输出邮编。如果某个城市一封信都没有,城市名后面直接空一行(什么都不输出),格式不能乱。

    参考代码

    // P4477 邮件分类:按邮编前两位(北京10/上海20/天津30)分类,按北京、上海、天津顺序输出
    #include <iostream>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        int b[10005], bs = 0;  // 北京地区的邮编及数量
        int s[10005], ss = 0;  // 上海地区的邮编及数量
        int t[10005], ts = 0;  // 天津地区的邮编及数量
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;
            if (x / 10000 == 10)        b[bs++] = x;  // 前两位是10 -> 北京
            else if (x / 10000 == 20)   s[ss++] = x;  // 前两位是20 -> 上海
            else if (x / 10000 == 30)   t[ts++] = x;  // 前两位是30 -> 天津
        }
        cout << "Beijing" << endl;
        for (int i = 0; i < bs; i++) { if (i) cout << ' '; cout << b[i]; }
        cout << endl;
        cout << "Shanghai" << endl;
        for (int i = 0; i < ss; i++) { if (i) cout << ' '; cout << s[i]; }
        cout << endl;
        cout << "Tianjin" << endl;
        for (int i = 0; i < ts; i++) { if (i) cout << ' '; cout << t[i]; }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    • 时间:读入并分类是一遍 O(n),输出三个袋子加起来也是 O(n),总时间 O(n)。
    • 空间:用了三个数组,总共最多存 n 个数,是 O(n)。
    • 1