1 条题解

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

    📝 题目大意

    NN 名用户,每名用户拥有用户名 SiS_i 和分数 CiC_i。将所有用户名按字典序排序后依次分配编号 0,1,,N10, 1, \dots, N-1,设总分 T=CiT = \sum C_i,则编号为 TmodNT \bmod N 的用户获胜,输出其用户名。

    💡 解题思路

    1. 题目分析N100N \leq 100,数据规模极小。用户名互不相同,分数 Ci4229C_i \leq 4229,总分 TT 最大约 4.2×1054.2 \times 10^5,完全在 int 范围内。唯一需要处理的是字符串的字典序排序。

    2. 算法推导

      • 读入 NN,将每个用户名存入数组 names,同时累加分数到 total
      • names 数组按字典序排序(C++ 中 std::sort 默认对 string 按字典序升序排列)。
      • 计算 winner_index = total % N
      • 输出 names[winner_index]
    3. 边界与细节

      • 用户名互不相同,所以排序后索引唯一确定,无需处理同名冲突。
      • TT 可能超过 int 范围吗?最坏情况 N=100,Ci=4229N=100, C_i=4229Tmax=422900T_{\max}=422900int 完全够用(上限约 2.1×1092.1 \times 10^9)。
      • 注意编号从 00 开始,取模结果直接作为数组下标即可。

    ⏱️ 复杂度分析

    • 时间复杂度O(NlogN)O(N \log N),来自排序。N100N \leq 100,几乎可以忽略。
    • 空间复杂度O(N)O(N),存储 NN 个字符串。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
    int main() {
        int N;
        cin >> N;
        vector<string> names(N);   // 存储所有用户名
        int total = 0;              // 分数总和
        for (int i = 0; i < N; i++) {
            string s;
            int c;
            cin >> s >> c;
            names[i] = s;           // 存入用户名
            total += c;             // 累加分数
        }
        sort(names.begin(), names.end());    // 按字典序排序
        int winner_index = total % N;        // 计算获胜者编号
        cout << names[winner_index] << endl; // 输出获胜者用户名
        return 0;
    }
    
    • 1

    信息

    ID
    798
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者