1 条题解
-
0
📝 题目大意
给定 个人的排名以及对应的用户名 ( 从 到 表示排名),取出前 名的用户名,按字典序升序输出。
💡 解题思路
-
题目分析:,字符串长度 ,数据规模极小。题目要求的是"取出前 名,再按字典序排序",而非"在所有 个人中排名前 的字典序最小者"。注意理解:先截取前 个元素,再对这个子集排序。
-
算法推导:
- 读入 和 ,将 个字符串全部存入数组
s[0..N-1]。 - 由于排名是输入顺序给出的(第 名对应 ,第 名对应 ,……),前 名就是数组的前 个元素
s[0..K-1]。 - 对
s[0..K-1]进行字典序排序,C++ 中sort(s, s + k)即可对string数组按字典序升序排列。 - 按行输出排序后的 个字符串。
- 读入 和 ,将 个字符串全部存入数组
-
边界与细节:
- 当 时,相当于对全部 个字符串排序,逻辑无需特殊处理。
- 当 时,只有一个元素,排序不影响结果,直接输出即可。
- 题目保证 互不相同,因此无需考虑去重。
- 注意
sort(s, s + k)中的区间是左闭右开,只排序前 个元素,后面的元素保持不变。
⏱️ 复杂度分析
- 时间复杂度:,其中 为字符串比较的代价,,完全可接受。
- 空间复杂度:,用于存储 个字符串。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int n, k; string s[110]; // 存储所有用户名,N ≤ 100 int main() { cin >> n >> k; // 读入 N 个用户名,按排名顺序存储 for (int i = 0; i < n; i++) { cin >> s[i]; } // 仅对前 K 名(即数组前 K 个元素)按字典序排序 sort(s, s + k); // 输出排序后的前 K 个用户名 for (int i = 0; i < k; i++) { cout << s[i] << endl; } return 0; } -
- 1
信息
- ID
- 679
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者