难度:入门。题目原型为洛谷 P1059 [NOIP 2006 普及组] 明明的随机数。本题的考点是计数数组一次完成去重与排序:值域只有 1..1000,用「桶下标 = 数值」天然有序,又天然去重。
目标
完成本题后,你应该能够:
- 解释为什么「值域很小时」计数数组比通用排序更简洁;
- 用计数数组同时完成去重与升序输出;
- 说明「置 1」与「累加计数」两种写法的区别与适用场景。
前置知识
- 11.1 排序的基本概念(升序、稳定排序);
- 11.4 计数排序:桶下标即数值,值域小时 O(n + 值域) 即可完成排序。
题目
明明想在学校中请一些同学做问卷调查,他把问卷编号后随机抽取了 n 个编号(都是 1..1000 之间的整数)。现在需要去掉其中重复的编号,再按从小到大排序,然后按排好的顺序统计并输出。
输入格式
- 第一行一个整数
n,表示随机编号的个数; - 第二行
n个整数,表示随机编号。
输出格式
- 第一行一个整数
M,表示不重复的编号个数; - 第二行
M个整数,为去重后从小到大排序的编号,空格分隔。
数据范围
| 项目 | 范围 |
|---|---|
个数 n | 1 ≤ n ≤ 100 |
| 编号值 | 1 ≤ 编号 ≤ 1000 |
样例
样例输入
input
10
20 40 32 67 40 20 89 300 400 15样例输出
output
8
15 20 32 40 67 89 300 400样例解释
10 个编号中 20、40 各出现了两次,去掉重复后剩下 8 个:15 20 32 40 67 89 300 400,按从小到大排列。
如何验证
先安装 Node.js、pnpm 和支持 C++17 的编译器。
powershell
# 已进入本 Lab 目录
make doctor
make run
make run CASE=001-sample
make interactive
make scoreWindows 没有安装 Make 时,在仓库根目录使用等价的 pnpm 入口:
powershell
pnpm lab:run -- labs/chapter-11/exercise/E-11-14-distinct-sort
pnpm lab:score -- labs/chapter-11/exercise/E-11-14-distinct-sort标准输出参与判题,调试信息请写入标准错误。
完成清单
思考题
- 如果要把
cnt[x] = 1改成cnt[x]++,输出的内容会有什么变化? - 为什么这道题不需要写任何「比较 + 交换」的排序代码?