【题解】洛谷 P1138 第 k 小整数:Python 大胜利
最近在复习 Python 时上了一下洛谷,翻到一道题,发现它体现了 Python 的优势,而且真的是期末考可能会考的那种题目。遂写题解。
P1138 第 k 小整数
题目链接:https://www.luogu.com.cn/problem/P1138
题目描述
现有 \(n\) 个正整数,要求出这 \(n\) 个正整数中的第 \(k\) 个最小整数(相同大小的整数只计算一次)。
输入格式
第一行为 \(n\) 和 \(k\);第二行开始为 \(n\) 个正整数的值,整数间用空格隔开。
输出格式
第 \(k\) 个最小整数的值;若无解,则输出 NO RESULT。
输入输出样例
输入
10 3
1 3 3 7 2 5 1 2 4 6
输出
3
说明/提示
\(n \le 10000\),\(k \le 4000\),正整数均小于 \(30000\)。
题解
本题用 C++ 需要一定技巧:
- 要么用
std::set,不过最后需要(部分)遍历; - 要么用
std::sort排序以后再在(部分)遍历时候判断重复; - 要么用桶排序,以空间换时间;
- 洛谷题解还有一堆奇奇怪怪的方法,属于整活性质。
但是用 Python 就很快,这道题变成了入门题。
Python 的 set 数据类型可以储存不重复的常量。利用这一点可以将所有正整数存入 set 中实现去重。同时,set 也可以被 sorted 函数作用(返回一个列表),从而实现排序。
所以用 Python 就可以将读入的数据传进一个 set,然后再 sorted 生成列表,最后再索引列表找到第 \(k\) 小的数。
标准程序
标准程序只有 7 行。同样的行数 C++ 估计只能写一个 A+B Problem。
n, k = map(int, input().split()) # 第一个 n 其实没用,但是还是读进来
nums = set(map(int, input().split())) # 先将输入切成列表后转换为 int,再用 set 去重
nums = sorted(nums) # 排序,默认从小到大,此时 num 是列表可以索引
if k <= len(nums): # 判断是否存在第 k 小的数
print(nums[k - 1]) # 注意 k 是从 1 开始的,所以要减 1
else:
print("NO RESULT") # 这些文字内容最好直接复制,不然会出现大小写之类的问题

浙公网安备 33010602011771号