蓝桥杯:染色时间

news2024/11/14 21:46:44

蓝桥杯:染色时间https://www.lanqiao.cn/problems/2386/learning/?contest_id=80

问题描述

输入格式

输出格式

样例输入输出

样例输入

样例输出

评测用例规模与约定

解题思路:优先队列

AC代码(Java):


问题描述

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

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

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

输入格式

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

        接下来 n 行, 每行 m 个正整数, 相邻的整数之间用一个空格分隔, 表示每 个方格的染色时间。该部分的第 i 行第 j 个整数表示 {\color{Red} 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≤{\color{Red} Tij}​≤1000 。

解题思路:优先队列

        首先我们分析一下,题目要求我们从0,0处开始染色,也就是我们让0,0开始染色的时候,它的上下左右四个方向所有使用的时间为 自身染色时间+0,0处的染色时间,如:

将0,0处染色之后,图中染色时间分布情况:
0 3 3
4 5 6

        我们知道,0,1处染色时间3肯定是要比1,0处染色时间快的,所以当0,1处染色完成,应该是这样的:

将0,1处染色之后,图中染色时间分布情况:
0 0 6
4 8 6

        其实这里就可以看出来了,可以依次将染色的点存入队列之中,每次取出耗时最短的点,然后将其上下左右四个位置加上自身染色所需要的时间即可。

        所以这道题可以用优先队列来做,我们定义一个类(结构体)Node,该类存放有三个属性,分别是x(行),y(列),time(染色累计耗时)。

   static class Node{
        int x;
        int y;
        int time; //耗时
        public Node(int x,int y,int time){
            this.x = x;
            this.y = y;
            this.time = time;
        }
    }

        这样我们就可以将0,0处节点的信息存放到优先队列中,每次我们取出耗时最短的一个节点,y也就是先完成染色的节点先出来,然后将其染色累计耗时,添加到上下左右四个还没有染色的节点中(如果染色了,我们就将对应位置的节点的值设置为0,方便判断)。

        依次再存入节点中,这样每次取出一个完成染色的节点,并且向四周开始没有染色的节点染色,这样优先队列中的最后一个节点就是我们完成染色所需要的时间。

AC代码(Java):

        因为使用Scanner只通过了80%,但是这道题的思路应该就是优先队列不会错,所以我将输入流换成了StreamTokenizer,提高读取性能,才全部通过。

        关于输入输出流性能,可以看:JAVA 输入输出优化

import java.io.*;
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {

    static class Node{
        int x;
        int y;
        int time; //耗时
        public Node(int x,int y,int time){
            this.x = x;
            this.y = y;
            this.time = time;
        }
    }

    static int[][] dires = {{-1,0},{0,-1},{1,0},{0,1}}; //四个方向,上,右,下,左
    
    //优化输入流
    static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    public static  int nextInt() throws IOException {
        st.nextToken();
        return (int) st.nval;
    }

    public static void main(String[] args) throws IOException{
        //在此输入您的代码...
        int n = nextInt();
        int m = nextInt();
        int[][] map = new int[n][m];
        for(int i = 0;i<n;i++){
            for(int j = 0;j<m;j++)
                map[i][j] = nextInt();
        }
        
        //首先队列,每次耗时最短的节点先出队,最后出队的就是耗时最久的
        PriorityQueue<Node> pq = new PriorityQueue<>((n1, n2)->(n1.time-n2.time)); //升序排序
        pq.add( new Node(0,0,map[0][0]) );
        //令该处为0,代表这个位置已经染色过了
        map[0][0] = 0;

        int ans = 0;
        while(!pq.isEmpty()){
            Node node = pq.poll();
            //将node节点上下左右的节点入队,并修改自己为 0,代表该节点已经染色
            for(int[] dire : dires){
                int x = node.x+dire[0];
                int y = node.y+dire[1];
                if(x>=0 && x<n && y>=0 && y<m && map[x][y]!=0){
                    pq.add(new Node(x,y,map[x][y]+node.time));
                     //令该处为0,代表这个位置已经染色过了
                    map[x][y] = 0;
                }
            }
            //该位置已经染色
            map[node.x][node.y] = 0;
            ans = node.time;
        }

        System.out.println(ans);
    }
}

        

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试题,用 Java 解【任务混部】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

本地docker部署mysql,IDEA直连实战

1、安装mysql镜像 前文中我们安装了docker和redis镜像&#xff0c;并在idea中成功连接&#xff0c;现在安装mysql镜像 docker pull mysql &#xff0c;默认最新版本 ps:可以参考https://www.runoob.com/docker/docker-install-mysql.html 2、启动mysql 打开powershell&…

快速掌握 Flutter 图片开发核心技能

大家好&#xff0c;我是 17。 在 Flutter 中使用图片是最基础能力之一。17 做了精心准备&#xff0c;满满的都是干货&#xff01;本文介绍如何在 Flutter 中使用图片&#xff0c;尽量详细&#xff0c;示例完整&#xff0c;包会&#xff01; 使用网络图片 使用网络图片超级简…

【035】基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文

1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统&#xff0c;通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括&#xff1a;首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …

【知识图谱】架构-特点-缺点简介

架构物联网、云计算、人工智能等新一代信息技术的迅猛发展&#xff0c;带来了制造业的新一轮突破&#xff0c;推动着制造系统向智能化方向发展&#xff0c;驱动着未来制造模式的创新。其中数据和知识是实现制造业与新一代信息技术融合的基础&#xff0c;是实现智能制造的保障。…

PyQt5(二) python程序打包成.exe文件

目录一、安装 **pyinstaller**二、pyinstaller 打包2.1 pyinstaller 打包机制参考链接前言我们在 pycharm 上写的程序在发送到一台没有安装 python 解释器的机器上是不能运行的&#xff0c;甚至还要安装程序中所使用的第三方包&#xff0c;这样极其不方便。 但是 PC 是可以直接…

【C++】哈希——unordered系列容器|哈希冲突|闭散列|开散列

文章目录一、unordered系列关联式容器二、哈希概念三、哈希冲突四、哈希函数五、解决哈希冲突1.闭散列——开放定址法2.代码实现3.开散列——开链法4.代码实现六、结语一、unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c…

MySQL 横表和竖表相互转换

一 竖表转横表 1. 首先创建竖表 create table student ( id varchar(32) primary key, name varchar (50) not null, subject varchar(50) not null, result int); 2. 插入数据 insert into student (id, name, subject, result) values (0001, 小明, 语文, 83); insert into…

RK系列(RK3568) 收音机tef6686芯片驱动,i2c驱动

SOC:RK3568模块&#xff1a;tef6686系统&#xff1a;Android121.首先目前tef6686只有单片机才有驱动&#xff0c;Linux要集成只需要控制模块内部的i2c地址的顺序从github下载tef6686 Andruino的代码 https://github.com/tehniq3/TEF6686解压进入TEF6686-master\TEF6686_1602i2c…

华为OD机试用Python实现 -【任务混部】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲任务混部题目输入输出示例一输入输出说明示例二输入输出说明备注Code代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.net/hihell/ca…

Google Guice 5:AOP

1. AOP 1.1 实际开发中面临的问题 在实际开发中&#xff0c;经常需要打印一个方法的执行时间&#xff0c;以确定是否存在慢操作 最简单的方法&#xff0c;直接修改已有的方法&#xff0c;在finnally语句中打印耗时 Override public Optional<Table> getTable(String da…

中级嵌入式系统设计师2014下半年下午试题与答案解析

中级嵌入式系统设计师2014下半年下午试题与答案解析 试题一 阅读下列说明和图,回答下列问题。 [说明] ATM自动取款机系统是一个由终端机、ATM系统、数据库组成的应用系统,具有提取现金、查询账户余额、修改密码及转账等功能。ATM自动取款机系统用例图如图1所示。

win11开始菜单增强工具:StartAllBack

StartAllBack是一款Windows11开始菜单增强工具&#xff0c;在任务栏上为Windows 11恢复经典样式的Windows 7主题风格开始菜单&#xff0c;主要功能包括&#xff1a;恢复和改进开始菜单样式、个性化任务栏、资源管理器等功能。软件功能恢复和改进任务栏在任务图标上显示标签调整…

【Spring】通过JdbcTemplate实现CRUD操作

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 通过JdbcTemplate实现 增删查改一、添加相关依…

python-下载某短视频平台视频(高清无水印)

python-下载某短视频平台音视频&#xff08;高清无水印&#xff09;前言1、获取视频 url2、发送请求3、数据解析4、本地保存5、完整代码前言 1、Cookie中文名称为小型文本文件&#xff0c;指某些网站为了辨别用户身份而储存在用户本地终端&#xff08;Client Side&#xff09;…

RTMP的工作原理及优缺点

一.什么是RTMP&#xff1f;RTMP&#xff08;Real-Time Messaging Protocol&#xff0c;实时消息传输协议&#xff09;是一种用于低延迟、实时音视频和数据传输的双向互联网通信协议&#xff0c;由Macromedia&#xff08;后被Adobe收购&#xff09;开发。RTMP的工作原理是&#…

Windows 11 网卡MAC地址 | 机器地址 | 网络地址 为 0 | 00-00-00-00-00-00?手动修复……

一位同事反映&#xff0c;他的电脑今天上班开机无法上网&#xff0c;上周末还正常&#xff0c;请我帮忙检修。该同事的电脑安装的是Windows 11&#xff0c;检查网络连接的详细信息&#xff0c;发现IP地址、网关、DNS参数都正常&#xff0c;但物理地址为00-00-00-00-00-00。另外…

力扣每日一题(2023年2月)

2023年2月期每日一题第一天 &#xff08;2325. 解密消息&#xff09;第十六天&#xff08;2341. 数组能形成多少数对&#xff09;第十七天 &#xff08;1139. 最大的以 1 为边界的正方形&#xff09;第十八天 &#xff08;1237. 找出给定方程的正整数解&#xff09;第十九天 &a…

再度盈利,搜狐稳了?

2016年在宣布要用3年时间回归互联网舞台中心之后&#xff0c;很长一段时间内张朝阳积极活跃在各种社交媒体上&#xff0c;完全是一派“积极出山”的姿态。而后畅游从美股退市&#xff0c;搜狗“卖身”腾讯&#xff0c;一系列的收缩动作又似乎是在逐渐远离喧嚣。而在最近三年&am…

Zilliz @ GAIDC |Milvus:生产级 AI 数据库探索

2月26日&#xff0c;全球人工智能开发者先锋大会— AI 数据与开源论坛在上海举行&#xff0c;Zilliz 主任工程师刘力在现场发表了名为《Milvus&#xff1a;生产级 AI 数据库探索》的演讲。刘力开篇便提到&#xff0c;Milvus 致力于打造更为完善的 AI 生态体系。随后&#xff0c…