1 条题解

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

    📝 题目大意

    给定 NN 次提交,每次提交包含一个字符串 SiS_i 和一个得分 TiT_i。对于每种字符串,只保留第一次出现的提交(称为"原创提交")。在所有原创提交中,找到得分最高的那次提交的编号;若得分相同,取编号最小者。

    💡 解题思路

    1. 题目分析N105N \leq 10^5,每个字符串最多只关心第一次出现,且之后出现的相同字符串可以直接忽略。需要支持快速判断字符串是否已出现过,以及维护当前最优得分及对应编号。

    2. 算法推导

      • 使用 map<string, bool> 记录字符串是否已经出现过,充当去重哈希表。
      • 按输入顺序(即提交编号 1N1 \sim N)遍历,对于每个字符串 SiS_i
        • v[S_i] 为真,说明之前已经出现过,直接跳过(continue)。
        • 否则,将其标记为 v[S_i] = true,并比较 TiT_i 与当前最优得分 ans
        • Ti>ansT_i > ans,则更新 ans = T_iid = i
      • 由于使用 严格大于>)而非 >=,当多个原创提交得分相同时,最早出现的那个会被保留,天然满足题目"得分相同取最早"的规则。
      • 最后输出 id
    3. 边界与细节

      • 得分 TiT_i 可能为 00,因此 ans 初始值需设为足够小的负数(代码中使用 -0x3f3f3f3f,约为 109-10^9,而 TiT_i 最小为 00,足够覆盖)。
      • 字符串长度不超过 1010map 的开销完全可接受。
      • 注意提交编号从 11 开始,输出的是 11‑based 编号。

    ⏱️ 复杂度分析

    • 时间复杂度O(NlogN)O(N \log N),每次 map 查找/插入为 O(logN)O(\log N)(字符串长度 S10|S| \leq 10,常数很小)。
    • 空间复杂度O(N)O(N),最坏情况下所有字符串互不相同,map 存储 NN 个字符串。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    string s;
    map<string, bool> v; // 记录字符串是否已出现过
    
    int main() {
        int n, ans = -0x3f3f3f3f, id = 0; // ans初始化为极小值,处理得分为0的情况
        cin >> n;
        for (int i = 1, x; i <= n; i++) {
            cin >> s >> x;
            // 如果该字符串已经出现过,跳过(非原创提交)
            if (v[s]) continue;
            // 标记为已出现
            v[s] = true;
            // 严格大于才更新,保证得分相同时保留最早的提交
            if (x > ans) {
                ans = x;
                id = i; // 记录当前最优提交的编号
            }
        }
        cout << id << '\n';
        return 0;
    }
    
    • 1

    信息

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