欢迎光临
我们一直在努力

哈希表整理(知识点梳理)(蓝桥杯2024省赛)(训练士兵)(字符串统计)(优质数对)(持续补充)

C++中的哈希(map,unordered_map)

一:map,unordered_map本质区别

二:底层原理区别

三:简单暴力理解

哈希题目

1.优质数对(蓝桥云课)

题目

https://www.lanqiao.cn/problems/3877/learning/?page=1&first_category_id=1&name=%E4%BC%98%E8%B4%A8%E6%95%B0%E5%AF%B9

分析:

用哈希表unordered_map

关键:

ai==bj;

 bi==aj;

 ai*sb+bi==bj*sb+aj;sb必须大于ai,bi该等式唯一成立

哈希循环部分先查找后插入

代码

2.字符串统计

题目

https://www.lanqiao.cn/problems/1206/learning/?page=1&first_category_id=1&name=%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%BB%9F%E8%AE%A1

分析

较简单,直接看注释

代码

3.字符统计(蓝桥杯2022省赛)

题目

https://www.lanqiao.cn/problems/2142/learning/?page=1&first_category_id=1&name=%E5%AD%97%E7%AC%A6%E7%BB%9F%E8%AE%A1

分析

用map:最后输出按字母顺序(ABCD)

以字符为key字符个数为value建立哈希表

auto x : h:遍历哈希表(后面解释)

代码

4.训练士兵(蓝桥杯2024省赛)

题目

https://www.lanqiao.cn/problems/19703/learning/?page=1&first_category_id=1&name=%E8%AE%AD%E7%BB%83%E5%A3%AB%E5%85%B5

分析

  • 核心思路:团购 vs 单买
    • 团购:花 S 金币,所有还没练满的士兵都练一次。
    • 单买:第 i 个士兵练一次花 pi​ 金币。

    贪心策略:当所有还没练满的士兵单买一次的总花费(即 onesum)大于团购价 S 时,我们就一直进行团购。直到剩下的士兵太少了,单买比团购更便宜,我们才停止团购,转为全部单买。


  • 哈希表(map)的作用:归类与排序
  • 代码中使用了 std::map<long long, long long> m,这里的哈希(严格说是红黑树实现的有序映射)起到了两个关键作用:

    • 归类:把需要训练次数相同的士兵放在一起。it->first 是需要训练的次数 ci​,it->second 是这些士兵单买一次的总花费。
    • 排序:map 会自动按训练次数 ci​ 从小到大排序。这非常重要,因为训练次数少的士兵会先 “毕业”,他们一旦练满,就不再贡献单买的费用了。

    3. 代码执行逻辑

  • 初始化:先假设所有士兵全部单买(计算出总额 sum),并算出第一轮所有人单买一次的总价 onesum。

  • 贪心筛选:

    • 遍历 map(按照训练次数从小到大)。
    • 只要当前的 onesum > S(团购更划算),我们就把这一批士兵 “团购” 到毕业。
    • 更新状态:每当一批训练次数少的士兵练满了,就把他们单买一次的钱从 onesum 里扣掉,因为以后团购不需要考虑他们了。
  • 计算差价:

    • 通过公式 sum = sum + temp * s – onesum * temp; 修正总花费。
    • 这步本质是:加上团购花的钱,减去原本计算单买时多算的钱。
  • 利用 map 的有序性,从训练次数最少的士兵开始剔除,动态维护“当前单买一次的总成本”,非常高效。

    for(auto p : h)的解释

    用于遍历哈希表

    加&,若p.seconf值改变,哈希数组mp也会变(理解为操作本身

    赞(0)
    未经允许不得转载:171主机测评 » 哈希表整理(知识点梳理)(蓝桥杯2024省赛)(训练士兵)(字符串统计)(优质数对)(持续补充)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址