1 条题解

  • 0
    @ 2026-6-19 10:30:27

    📝 题目大意

    给定 NN 个人的排名以及对应的用户名 SiS_iii11NN 表示排名),取出前 KK 名的用户名,按字典序升序输出。

    💡 解题思路

    1. 题目分析N100N \leq 100,字符串长度 10\leq 10,数据规模极小。题目要求的是"取出前 KK 名,再按字典序排序",而非"在所有 NN 个人中排名前 KK 的字典序最小者"。注意理解:先截取前 KK 个元素,再对这个子集排序。

    2. 算法推导

      • 读入 NNKK,将 NN 个字符串全部存入数组 s[0..N-1]
      • 由于排名是输入顺序给出的(第 11 名对应 S1S_1,第 22 名对应 S2S_2,……),前 KK 名就是数组的前 KK 个元素 s[0..K-1]
      • s[0..K-1] 进行字典序排序,C++ 中 sort(s, s + k) 即可对 string 数组按字典序升序排列。
      • 按行输出排序后的 KK 个字符串。
    3. 边界与细节

      • K=NK = N 时,相当于对全部 NN 个字符串排序,逻辑无需特殊处理。
      • K=1K = 1 时,只有一个元素,排序不影响结果,直接输出即可。
      • 题目保证 SiS_i 互不相同,因此无需考虑去重。
      • 注意 sort(s, s + k) 中的区间是左闭右开,只排序前 KK 个元素,后面的元素保持不变。

    ⏱️ 复杂度分析

    • 时间复杂度O(KlogKL)O(K \log K \cdot L),其中 L10L \leq 10 为字符串比较的代价,KN100K \leq N \leq 100,完全可接受。
    • 空间复杂度O(NL)O(N \cdot L),用于存储 NN 个字符串。

    💻 标准代码 (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
    上传者