【题解】洛谷 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")  # 这些文字内容最好直接复制,不然会出现大小写之类的问题

posted @ 2025-06-19 17:33  mike_unk  阅读(28)  评论(0)    收藏  举报