题解
邮件分类
1 条题解
-
0
解题思路
邮政编码是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