1 条题解
-
0
📝 题目大意
给定 次提交,每次提交包含一个字符串 和一个得分 。对于每种字符串,只保留第一次出现的提交(称为"原创提交")。在所有原创提交中,找到得分最高的那次提交的编号;若得分相同,取编号最小者。
💡 解题思路
-
题目分析:,每个字符串最多只关心第一次出现,且之后出现的相同字符串可以直接忽略。需要支持快速判断字符串是否已出现过,以及维护当前最优得分及对应编号。
-
算法推导:
- 使用
map<string, bool>记录字符串是否已经出现过,充当去重哈希表。 - 按输入顺序(即提交编号 )遍历,对于每个字符串 :
- 若
v[S_i]为真,说明之前已经出现过,直接跳过(continue)。 - 否则,将其标记为
v[S_i] = true,并比较 与当前最优得分ans。 - 若 ,则更新
ans = T_i及id = i。
- 若
- 由于使用 严格大于(
>)而非>=,当多个原创提交得分相同时,最早出现的那个会被保留,天然满足题目"得分相同取最早"的规则。 - 最后输出
id。
- 使用
-
边界与细节:
- 得分 可能为 ,因此
ans初始值需设为足够小的负数(代码中使用-0x3f3f3f3f,约为 ,而 最小为 ,足够覆盖)。 - 字符串长度不超过 ,
map的开销完全可接受。 - 注意提交编号从 开始,输出的是 ‑based 编号。
- 得分 可能为 ,因此
⏱️ 复杂度分析
- 时间复杂度:,每次
map查找/插入为 (字符串长度 ,常数很小)。 - 空间复杂度:,最坏情况下所有字符串互不相同,
map存储 个字符串。
💻 标准代码 (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
- 上传者