难度:进阶。题目原型为洛谷 P1138 第 k 小整数。本题的考点是排序 + 去重后的边界处理:std::unique 只把重复元素移到末尾,必须配合 erase 真正删除,且去重后数量不足 k 时要输出 NO RESULT。
目标
完成本题后,你应该能够:
- 用
sort+unique+erase完成去重; - 正确处理「去重后不足
k个」的边界情况; - 理解
unique的返回值为什么是「新逻辑末尾」而不是直接改变容器大小。
前置知识
std::sort;std::unique与std::vector::erase。
题目
读入 n、k 和 n 个整数。把所有整数去重后从小到大排列,输出第 k 小的整数;若去重后的整数不足 k 个,则输出 NO RESULT。
输入格式
- 第一行两个整数
n、k; - 第二行
n个整数。
输出格式
一行一个整数,或字符串 NO RESULT。
数据范围
| 项目 | 范围 |
|---|---|
数组长度 n | 1 ≤ n ≤ 10⁴ |
| 元素值 | −10⁶ ≤ a[i] ≤ 10⁶ |
样例
样例输入
input
8 3
3 2 3 1 2 4 5 5样例输出
output
3样例解释
去重后为 1 2 3 4 5,第 3 小的整数是 3。
如何验证
先安装 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-09-kth-distinct
pnpm lab:score -- labs/chapter-11/exercise/E-11-09-kth-distinct标准输出参与判题,调试信息请写入标准错误。
完成清单
思考题
- 如果只调用
unique而不调用erase,会发生什么?a.size()会变吗? - 本题
|a[i]| ≤ 10⁶,能不能用计数数组(桶)代替排序?两者分别适合什么数据范围?