蓝桥杯双周赛算法心得——通关(哈希+小根堆)

2023-10-28 03:52

本文主要是介绍蓝桥杯双周赛算法心得——通关(哈希+小根堆),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是晴天学长,这是很重要的贪心思维题,哈希的存法和小根堆的表示很重要。


1) .通关

在这里插入图片描述


2) .算法思路

通关

用hash(int[])存点的子节点并按输入顺序存关卡的号码(输入顺序就是)
列如:key:父节点
难度 经验 关卡
优先队列存难度和节点

1.接受数据和初始经验。(用快读)。
2.判断第1关能过不。
3.把第1关的子节点放入队列
4.从队列中取出元素
5.挑战成功再把子元素丢入队列中
6.ans++;


3).算法步骤

1.从输入中读取关卡数量 n 和初始经验值 sum。
2.读取第一关的难度、关卡和经验值,并将其存储在map中。
3.如果初始经验值小于第一关的经验值要求,则输出0并返回。
4.增加初始经验值并增加答案计数器。
5.循环读取剩余的关卡信息,并将其存储在map中。
6.创建一个小顶堆(优先队列)queue,并将第一关的子节点放入小顶堆。
7.循环处理小顶堆中的关卡节点,直到小顶堆为空。
8.从小顶堆中取出一个关卡节点,比较当前经验值是否小于关卡节点的难度要求,如果是,则输出答案计数器并返回。
9.增加经验值并增加答案计数器。
10.如果当前关卡有子节点,则将子节点放入小顶堆。
11.输出最终的答案计数器。


4). 代码实例

package LanQiaoTest.大小堆;import java.util.*;//变种广搜
public class 通关_小顶堆 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);Map<Integer, List<int[]>> map = new HashMap<>();//关卡int ans = 0;int n = scanner.nextInt();//经验值int sum = scanner.nextInt();//存第一关int temp = scanner.nextInt();int temp1 = scanner.nextInt();int temp2 = scanner.nextInt();map.put(temp, new ArrayList<>());map.get(temp).add(new int[]{0, temp1, temp2});int[] temp3 = map.get(temp).get(0);if (sum < temp3[2]) {System.out.println(ans);return;}sum += temp3[1];ans++;//存子节点了for (int i = 1; i < n; i++) {//父节点int a = scanner.nextInt();//挑战成功的经验值int b = scanner.nextInt();//难度int c = scanner.nextInt();if (!map.containsKey(a)) {map.put(a, new ArrayList<>());}//父节点        难度 关卡 经验值map.get(a).add(new int[]{c, i + 1, b});}//用优先队列(默认小根堆)PriorityQueue<Integer[]> queue = new PriorityQueue<>((a, b) -> (a[0] - b[0]));//把第一关的子节点丢入小根堆for (int i = 0; i < map.get(1).size(); i++) {int[] temp4 = map.get(1).get(i);//难度 关卡 经验值queue.offer(new Integer[]{temp4[0], temp4[1], temp4[2]});}// 开始闯关while (!queue.isEmpty()) {//难度 关卡 经验值Integer[] temp5 = queue.poll();//对比if (sum < temp5[0]) {System.out.println(ans);return;}sum += temp5[2];ans++;//把闯的关的子节点丢入小根堆if (map.containsKey(temp5[1])) {for (int i = 0; i < map.get(temp5[1]).size(); i++) {int[] temp6 = map.get(temp5[1]).get(i);queue.offer(new Integer[]{temp6[0], temp6[1], temp6[2]});}}}System.out.println(ans);scanner.close();}
}

4).总结

  • 小根堆的表示(在贪心题中经常使用)
  • 哈希表的正确使用。

试题链接:

这篇关于蓝桥杯双周赛算法心得——通关(哈希+小根堆)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/290515

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时