临时抱抱佛脚,太浮躁了,蓝桥杯已经快1个半月没做题了。

        本人比较菜,感觉这个时间节点也只能把暴力题给尽量多做做,找找做题手感,其他就纯凭运气了吧。T-T。

题目

问题描述

小蓝有一个 n 行 m 列的白色棋盘, 棋盘的每一个方格都可以被染成彩色。

每个方格有一个染色时间 tij, 不同方格的染色时间可能不同。如果一个方 格被触发了染色, 这个方格就会在 tij秒之后变成彩色, 然后将自己上下左右四 个方向相邻的方格触发染色。每个方格只能被触发染色一次, 第一次触发之后 的触发为无效触发。

给定每个方格的染色时间, 在时刻 0 触发第一行第一列的方格染色, 请问 多长时间后整个棋盘完成染色。

输入格式

输入的第一行包含两个整数 n,m,分别表示棋盘的行数和列数。

接下来 n 行, 每行 m 个正整数, 相邻的整数之间用一个空格分隔, 表示每个方格的染色时间。该部分的第 i 行第 j 个整数表示 tij​, 即第 i 行第 j 列的方 格的染色时间。

输出格式

输出一行包含一个整数, 表示整个棋盘完成染色的时间。

样例输入

2 3
1 2 3
4 5 6

样例输出

12

评测用例规模与约定

对于 30 的评测用例, 1≤n,m≤10。

对于 60 的评测用例, 1≤n,m≤50 。

对于所有评测用例, 1≤n,m≤500,1≤tij≤1000。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

题意

        就是他有一个n*m的棋盘,然后每个方格都可以被染色,但是只有到了那个染色时间,这个方格才能触发染色。从他刚被触发,到染色完成变成彩色,需要tij的时间。让你求,n*m个格子全都染色完成时的时间是多少。

思路

        这题会很容易想到是BFS,就是从最先变成彩色的点开始向外扩展,每次更新时间就可以。我们先来看一下代码。

        代码主要用到优先队列,因为我们需要让染色时间最短的先出队列。

        这里是菜鸟踩坑的地方(踩的第一个坑):

                但是我最开始并没有用优先队列,我是直接先对list按照tij从小到大排序,然后在bfs里用的普通队列,我自认为bfs()中的普通队列也是按照tij从小到大排好的。不知道你们有没有这种想法。这种想法是肯定不可以的啊。原因如下,因为按下面这份代码来说,如果你直接在main方法里将list按照tij排序,你只能保证第一个进入普通队列的tij值一定是最小的,但是后续的你无法保证。

        为什么呢?

        因为当你第一次进入while的时候,肯定tij最小的那个已经进入队列了,然后你就要开始四个方向的遍历,但是你无法保证(tx,ty)上的tij一定是第二小的,对吧。而且我们上下左右定义的顺序都不一样,更何况说一定能保证tij从小到大进队列。所以普通队列不可行,必须在bfs()里用优先队列,让每一次出队的都是队列中tij最小的。

        这里是菜鸟难以跨越的第二个坑T/\T:

                就是题目既然问你最终n*m个格子染色完成的时间了,所以bfs()中肯定要有一个变量记录一下这个结果吧,那么怎么记录呢?本菜鸟就卡这了。

                最开始我写的代码特离谱,static里定义了一个ans,bfs()里定义了res,又是比较大小啥的。。。

                其实就在bfs()里用一个变量持续更新就行了,下面代码里用的是res。下面讲一下更新res的逻辑:while外我定义res的初始值为0,当第一次进入while循环时,直接让res = poll[2]即可。就该题而言,第一次进入while时,res = poll[2] = 1。为什么让res=poll[2],而不是用max去取res和poll[2]的最大值,我们后面会说。

                之后我们进行四个方向的尝试,如果更新后的格子坐标不越界并且未被访问过,我们就将其坐标以及更新后的tij加到队列中,并将vis设为true。

为什么要在这个地方更新tij???

先看下边的图,辅助我们理解。

        上边的(0,1,3)入队啥的,(0,1)是格子索引,3是更新完的时间。

还是这个问题:为什么要在这个地方更新tij???

        就是不知道能不能get到这个点,就是你在queue.offer里更新时间的话,是有一个向后性的,也就是说你更新的永远是最新的节点,相当于你在直接的更新结果,即你求的是从起点到终点的累计时间

        就是不知道有没有人会这么写,可能会有点误导,这就是本菜鸟踩的第三个大坑:

                不在queue.offer里更新时间,直接queue.offer(tx,ty,g[tx][ty]);然后把前边的res = poll[2];改成res += poll[2];这样肯定是不对的啊。如果你这样写的话,那res岂不是表示所有出队节点时间的总和了吗,因为直接queue.offer(tx,ty,g[tx][ty]);,所以并没有更改每个格子的时间。

        下面来说一下为什么让res=poll[2],而不是用max去取res和poll[2]的最大值???

        这个问题也困了我很久,但是你看右上方图片里写的文字表述,应该可以发现,收到优先队列的影响,每次出来的都是tij最短的,所以受他影响的格子的完成染色的时间一定是最早的。为什么?因为你一把他触发,vis在代码里就设为true了,后边出队的格子没法影响它已经影响过的格子了。所以每次的poll[2]其实就是当前格子被染色完成的最早的时间点。

        希望能帮助到大家。虽然文章还有很多不足之处。

代码

import java.util.*;
public class 染色时间 {static int n;static int m;static int[][]g;static boolean [][]vis;static int [][]f = {{1,0},{-1,0},{0,1},{0,-1}};static List<int []> list;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();g = new int[n][m];list = new ArrayList<>();vis = new boolean[n][m];for(int i = 0;i < n;i ++) {for (int j = 0;j < m;j ++) {g[i][j] = sc.nextInt();list.add(new int[]{i,j,g[i][j]});}}int ans = bfs(list.get(0)[0],list.get(0)[1],list.get(0)[2]);System.out.println(ans);}public static int bfs(int x, int y, int time) {PriorityQueue<int[]> queue = new PriorityQueue<>((a,b)->a[2]-b[2]);queue.offer(new int[]{x,y,time});vis[x][y] = true;int res = 0;while (!queue.isEmpty()) {int []poll = queue.poll();res = poll[2];for(int i = 0;i < 4;i ++) {int tx = poll[0] + f[i][0];int ty = poll[1] + f[i][1];if (tx >= 0 && tx < n && ty >= 0 && ty < m && !vis[tx][ty]) {queue.offer(new int[]{tx,ty,g[tx][ty] + res});vis[tx][ty] = true;}}}return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87047.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87047.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87047.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 究极奥义·动态乾坤大挪移·无敌行列转换术

导入大SQL文件 [mysqld] # 大批量导入优化 bulk_insert_buffer_size1G max_allowed_packet1G innodb_autoextend_increment512M innodb_buffer_pool_size4G innodb_log_buffer_size4G innodb_log_file_size4G动态行列转换 DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_sco…

Excel大厂自动化报表实战(互联网金融-数据分析周报制作中)

这是Excel大厂自动化报表实战第三期--互联网金融-数据分析周报制作中 数据资源已经与这篇博客捆绑&#xff0c;有需要者可以下载通过网盘分享的文件&#xff1a;2.4自动化报表-8月成交数据.xlsx&#xff0c;2.4自动化报表-8月获客数据.csv等2个文件 链接: https://pan.baidu.c…

langchain从入门到精通(七)——利用回调功能调试链应用 - 让过程更透明

1. Callback 功能介绍 Callback 是 LangChain 提供的回调机制&#xff0c;允许我们在 LLM 应用程序的各个阶段使用 hook &#xff08;钩子&#xff09;。钩子的含义也非常简单&#xff0c;我们把应用程序看成一个一个的处理逻辑&#xff0c;从开始到结束&#xff0c;钩子就是在…

如何使用Postman做接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文适合已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。 工作环境与版本&#xff1a; …

ELK日志文件分析系统——E(Elasticsearch)

目录 基本概念 一、架构设计 二、核心原理 三、关键特性 四、应用意义 部署步骤 ‌一、环境准备‌ ‌二、安装 Elasticsearch‌ ‌三、关键配置&#xff08;elasticsearch.yml&#xff09;‌ ‌四、启动与验证‌ ‌五、集群扩展&#xff08;新增节点&#xff09;‌ …

融智学教育观及其数学公式体系凝练汇总

摘要&#xff1a;本文系统阐述了邹晓辉教授的融智学教育观&#xff0c;通过原创数学公式体系构建了人机协同教育模型。核心内容包括&#xff1a;认知本体论&#xff08;文明智慧当量方程&#xff09;、方法论&#xff08;七遍通训练算子&#xff09;、生态位控制论&#xff08;…

互联网大厂Java求职面试:AI大模型应用实践中的架构挑战与实战

互联网大厂Java求职面试&#xff1a;AI大模型应用实践中的架构挑战与实战 引言 在当今技术飞速发展的时代&#xff0c;AI大模型已成为企业数字化转型的重要引擎。无论是内容生成、智能客服、个性化推荐&#xff0c;还是知识图谱构建和语义理解&#xff0c;大模型的应用场景正在…

龟兔赛跑算法(Floyd‘s Cycle-Finding Algorithm)寻找重复数

龟兔赛跑算法&#xff08;Floyd’s Cycle-Finding Algorithm&#xff09;寻找重复数 问题描述 给定一个长度为 N1 的数组 nums&#xff0c;其中每个元素的值都在 [1, N] 范围内。根据鸽巢原理&#xff0c;至少有一个数字是重复的。请找出这个重复的数字。 要求&#xff1a; …

紫光展锐T8300以创新音频技术重塑感知世界

数字化时代&#xff0c;从语音通话到智能交互&#xff0c;从聆听音乐到创作Vlog&#xff0c;声音已成为隐形的基础措施。日益发展的音频技术正在重构用户感知世界的方式&#xff0c;重塑用户的听觉体验。 T8300是紫光展锐专为全球主流用户打造的5G SoC&#xff0c;采用了紫光展…

写作词汇积累(A):颇有微词、微妙(“微”字的学习理解)

一、颇有微词 1、基本介绍 【颇有微词】指对某人或某事有轻微的批评、不满或不同意见&#xff0c;但表达得含蓄委婉 【颇】表示程度较深&#xff0c;【微词】表示隐晦的批评 【微】表示隐晦的、不直白的&#xff0c;强调批评的委婉性 2、使用实例 1、尽管公司的新考勤制度…

flowable工作流的学习demo

1.spring 部署流程 删除部署 查看历史信息 加载一个默认的配置文件 里面包含用户名和数据库信息 加载自定义的配置文件 flowable.cfg.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

XCTF-misc-can_has_stdio?

下载得到一个文件 ┌──(kali㉿kali)-[~] └─$ file misc50 misc50: ASCII text, with very long lines (536)┌──(kali㉿kali)-[~] └─$ cat misc50 …

【编译工具】(自动化)AI 赋能的自动化测试工具:如何让测试效率提升 500% 并实现智能质检?

#『编程工具』提升效率征文挑战赛# 目录 引言&#xff1a;AI 如何重塑自动化测试格局 一、新一代 AI 测试工具核心能力解析 二、实战演示&#xff1a;Testim 智能测试平台 &#xff08;1&#xff09;智能录制测试流程 ① 步骤演示 ② AI 元素定位原理 &#xff08…

毛纪逆向分析

文章目录 毛纪逆向分析前言知识系统整体架构概述模块分析模块0模块1模块2模块3模块4模块5总结毛纪逆向分析 对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学(系统理论和实战教程)、提供接单兼职渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698…

【力扣 简单 C】141. 环形链表

目录 题目 解法一&#xff1a;哈希 解法二&#xff1a;快慢指针 题目 解法一&#xff1a;哈希 struct node {struct ListNode* val;struct node* next; };struct hashSet {struct node** bucket;int size; };struct hashSet* hashSetInit(int size) {struct hashSet* hashS…

Eureka 服务注册与发现原理和使用

1.Eureka 基础概念 Eureka 是 Netflix 开发的服务注册与发现组件&#xff0c;是 Spring Cloud 微服务架构中的核心模块&#xff0c;用于解决微服务间的自动发现与通信问题。其核心功能包括&#xff1a; 服务注册&#xff1a;服务实例将自身信息&#xff08;IP、端口、健康状态等…

create_react_agent + MCP tools

文章目录 MCP tools 调用结果输出MCP Tool 内容成功返回失败返回 普通工具调用 https://blog.csdn.net/2401_89025022/article/details/148629902 MCP tools 调用 import time import asyncio import json from langgraph.prebuilt import create_react_agent from langch…

提示词Prompts(1)

摘要&#xff1a; 本文介绍了langchain.prompts中基础的提示词模板的用法&#xff0c;包括基础的文本模板、对话模板、小样本模板、以及主要两种样本选择器的用法。 文章目录 1. prompts介绍&#xff1f;2. 提示词模板体系 Prompt Templates2.1 基础文本模板 PromptTemplate2.2…

如何在 Elementary OS 上安装最新版本的 VirtualBox

Elementary OS 是一个基于 Ubuntu Linux 的发行版&#xff0c;它易于使用&#xff0c;对初学者友好&#xff0c;并且在用户中非常受欢迎。如果你是 Elementary OS 的用户&#xff0c;并且想在上面虚拟运行和探索其他操作系统&#xff0c;那么 Oracle VirtualBox 是一个非常不错…

uni-app项目loading显示方案

前情 uni-app是我比较喜欢的跨平台框架&#xff0c;它能开发小程序/H5/APP(安卓/iOS)&#xff0c;重要的是对前端开发友好&#xff0c;自带的IDE可视化的运行和打包也让开发体验也非常棒&#xff0c;公司项目就是主推uni-app&#xff0c;为了用户体验对于耗时操作&#xff0c;…