草庐IT

第十四届蓝桥杯省赛JavaB组试题E【蜗牛】个人题解Dijkstra堆优化

微风撞见云 2023-06-11 原文

                                                                                 🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝

                                              第十四届蓝桥杯省赛JavaB组试题E【蜗牛】个人题解 Dijkstra堆优化          

时间:🍏2023年4月11日10:28:22发现问题,致歉大家,我的纵坐标存储方式是错误的,但是总体思路没问题。🍑错误原因:
   今天突然发现了一个问题,我存储的纵坐标的方式的错误的,按照之前发的题解我是这样来存储的:x + N + y,我记错了,应该是x * N + y,为什么是错误的呢?
   首先,N是横纵坐标中最值较大的那一个,那么在此题,很明显是xi,它最大是1
e9,而纵坐标ai、bi只有1e4,那么此时N就是1e9,而x * N + y的最大就是1e18+1e4。显然超出了数组的容量,当时没注意,误把N看作是站点个数1e5了,所以想到了这样的办法。给大家说声抱歉。
   这样做有什么好处呢?这样可以把二维坐标用一维来存,什么原理?令index = x * N + y;那么x = index / N;y = index % N;确实好用,但是此题数据范围过大,如果这样存储不能过全部样例
   当时没做出来也是不知道怎么存储纵坐标,所以我还是认为此题难在如何存储传送门的位置,因为传送门的位置是二维的,如果开二维数组,在编译的时候一样的堆溢出的,很懊恼,看看之后有没有其他大神的题解吧。


文章目录


🍋前言

🍐小伙伴们大家好,好久没更新文章了,最近一直在准备蓝桥杯。为什么我要先发这道题的题解呢?不是因为我当时做出来了,而是因为我当时大意了没做出来。如果这道题的纵坐标存好了,我应该直接秒的,说多了都是泪…唉,一言难尽。话不多说,先看解析吧!

🍋题目描述


🍐没看懂题意?看到“传送门”“魔法蜗牛”怕了吗,哈哈哈哈哈哈哈哈哈! 来,我手把手教你用魔法打败魔法。咱们先来捋捋题目到底是啥意思,看个图↓

🍋解题思路

🍐图中方框代表传送门,箭头线代表可走的路径,注意,这些路线都是有方向的。我们可以把所有的位置看作是一个一个的站点,题意就变为了从原点出发,到终点的最短时间,而这个时间就等同于我们最短路径问题的距离。(还是不清楚怎么走的同学,可以配合着我的图画,看看在图片最后的坐标走向是怎么样的。

🍐这道题的难点之一在于如何存储杆子上传送门的位置,通过思考我们可以得知,杆子的位置与杆子的横坐标有关,与传送门的纵坐标有关,我当时太笨了,用了一个类去存,结果在写链式前向星的时候人傻了… 正确的做法是y = idx(杆子的横坐标)+ N(最大站点数目) + ai(传送门的高度) ,这样可以保证传送门的位置是唯一确定的,如果不加N,有可能会与后面的杆子位置重复。

🍐站点位置存好了,那边呢?一共就这么几种边:①水平边,水平边很好办,枚举前n-1个杆子的位置,距离(时间)就是横坐标相减,建立起来就好。②竖直边,传送门与地面的距离,这个刚才说了,注意一点,他们的距离不是直接写高度,上去和下来的速度是不一样的,于是我们有:

static double levelTime = 1.0, downTime = 1.0 / 1.3, upTime = 1.0 / 0.7;

🍐levelTime 表示水平的单位时间,downTime 表示下落的单位时间,upTime 表示爬上杆子的单位时间。③传送门的边,这个边很特殊,因为是瞬移,所以权值为0。


🍐怎么样,是不是可以秒了?我当时也这么觉得,但是我很菜,做这个题的时候已经没多少时间了,真的很慌,没想到怎么存杆子上的位置,他真的,我哭死!!!省一应该没了… 不甘心归不甘心,题解还是要发的!我们来看代码怎么写

🍋Code分析

🍋我们不妨先看看用例范围:1e5?标准的dijkstra堆优化链式前向星建图时间复杂度是O(n logn),稳的!那么边的数目是多少呢?dis[]数组开多大呢?我们从刚才是这个地方“y = idx(杆子的横坐标)+ N(横纵坐标较大的那个范围) + ai(传送门的高度)”以及题目的样例范围可以得出,我们给他开3倍大小的N就足够,边呢?应该是这么多:N(水平)+2N(竖直来回)+N(传送门) = 4N,管他呢,反正N最大才1e5,我们待会儿直接直接开十倍。然后就是输出那里,这里用printf来控制一下输出就行,详情看代码。

🍋Code实现

import java.io.*;
import java.util.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: LiangXinRui
 * @Date: 2023/4/8 17:33
 * @Description: 输入
 * 3
 * 1 10 11
 * 1 1
 * 2 1
 * 输出
 * 4.20
 */

public class Main {
    final static int N = (int) (1e5 + 10), M = 10 * N;
    static int n, total;
    static double levelTime = 1.0, downTime = 1.0 / 1.3, upTime = 1.0 / 0.7;
    static double[] dis = new double[3 * N];//每个站点到原点的最短距离(时间)
    static int[] idx = new int[N];//存每个杆子的横坐标
    static int[] head = new int[M], ends = new int[M], next = new int[M];
    static double[] weights = new double[M];
    static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    static void add(int start, int end, double weight) {
        ends[total] = end;
        weights[total] = weight;
        next[total] = head[start];
        head[start] = total++;
    }

    public static void main(String[] args) {
        n = nextInt();
        Arrays.fill(head, -1);
        for (int i = 0; i < n; i++) idx[i] = nextInt();
        //存水平的边,上下的边,传送门的边,纵坐标用横坐标+n+ai来表示
        //添加水平边
        add(0, idx[0], levelTime);
        for (int i = 0; i < n - 1; i++) {
            add(idx[i], idx[i + 1], levelTime * (idx[i + 1] - idx[i]));
        }
        for (int i = 0; i < n - 1; i++) {//竖直边
            int ai = nextInt();
            int bi = nextInt();
            //传送门的单向边
            add(idx[i] + N + ai, idx[i + 1] + N + bi, 0);
            //第一个传送门与地面的边
            add(idx[i], idx[i] + N + ai, upTime);
            add(idx[i] + N + ai, idx[i], downTime);
            //第二个传送门与地面的边
            add(idx[i + 1], idx[i + 1] + N + bi, upTime);
            add(idx[i + 1] + N + bi, idx[i + 1], downTime);
        }
        dijkstra();
        System.out.printf("%.2f", dis[idx[n - 1]]);
    }

    static void dijkstra() {
        Queue<Node> queue = new PriorityQueue<>((o1, o2) -> (int) (o1.dis - o2.dis));//优先队列堆优化
        Arrays.fill(dis, Double.MAX_VALUE);
        dis[0] = 0;
        queue.offer(new Node(0, weights[0]));
        while (!queue.isEmpty()) {
            Node hh = queue.poll();
            for (int i = head[hh.num]; i != -1; i = next[i]) {
                int j = ends[i];
                if (dis[j] > dis[hh.num] + weights[i]) {
                    dis[j] = dis[hh.num] + weights[i];
                    queue.offer(new Node(j, dis[j]));
                }
            }
        }
    }

    static class Node {
        int num;
        double dis;

        public Node(int num, double dis) {
            this.num = num;
            this.dis = dis;
        }
    }

    static int nextInt() {
        try {
            in.nextToken();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return (int) in.nval;
    }
}


🌹🌹🌹大家觉得今年的题更难一点吗?在评论区`说说自己的看法吧。💐💐💐

🌸🌸🌸第一时间发题解,求安慰求点赞~ 呜呜呜,感谢大家!!!🌷🌷🌷


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟文章粗浅,希望对大家有帮助!

有关第十四届蓝桥杯省赛JavaB组试题E【蜗牛】个人题解Dijkstra堆优化的更多相关文章

  1. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  2. 蓝桥杯备赛(二) - 2

    目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言:  在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC  已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析  这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy

  3. Ruby 缺少常量表达式优化? - 2

    我希望Ruby的解析器会进行这种微不足道的优化,但似乎并没有(谈到YARV实现,Ruby1.9.x、2.0.0):require'benchmark'deffib1a,b=0,1whileb由于这两种方法除了在第二种方法中使用预定义常量而不是常量表达式外是相同的,因此Ruby解释器似乎在每个循环中一次又一次地计算幂常数。是否有一些Material说明为什么Ruby根本不进行这种基本优化或只在某些特定情况下进行? 最佳答案 很抱歉给出了另一个答案,但我不想删除或编辑我之前的答案,因为它下面有有趣的讨论。正如JörgWMittag所说,

  4. ruby-on-rails - 优化读取数据库和写入csv文件 - 2

    我正在尝试从数据库中读取大量单元格(超过100.000个)并将它们写入VPSUbuntu服务器上的csv文件。碰巧服务器没有足够的内存。我正在考虑一次读取5000行并将它们写入文件,然后再读取5000行,等等。我应该如何重构我当前的代码以使内存不会被完全消耗?这是我的代码:defwrite_rows(emails)File.open(file_path,"w+")do|f|f该函数由sidekiqworker调用:write_rows(user.emails)感谢您的帮助! 最佳答案 这里的问题是,当您调用emails.each时,

  5. 软约束、硬约束、Minimum Snap的轨迹优化方法 - 2

    文章目录前言约束硬约束的轨迹优化Corridor-BasedTrajectoryOptimizationBezierCurveOptimizationOtherOptions软约束的轨迹优化Distance-BasedTrajectoryOptimization优化方法前言可以看看我的这几篇Blog1,Blog2,Blog3。上次基于MinimumSnap的轨迹生成,有许多优点,比如:轨迹让机器人可以在某个时间点抵达某个航点。任何一个时刻,都能数学上求出期望的机器人的位置、速度、加速度、导数。MinimumSnap可以把问题转换为凸优化问题。缺点:MnimumSnap可以控制轨迹一定经过中间的

  6. java实现Dijkstra算法 - 2

    文章目录一.Dijkstra算法想解决的问题二.Dijkstra算法理论三.java代码实现一.Dijkstra算法想解决的问题解决的问题:求解单源最短路径,即各个节点到达源点的最短路径或权值考察其他所有节点到源点的最短路径和长度局限性:无法解决权值为负数的情况二.Dijkstra算法理论参数:S记录当前已经处理过的源点到最短节点U记录还未处理的节点dist[]记录各个节点到起始节点的最短权值path[]记录各个节点的上一级节点(用来联系该节点到起始节点的路径)Dijkstra算法步骤:(1)初始化:顶点集S:节点A到自已的最短路径长度为0。只包含源点,即S={A}顶点集U:包含除A外的其他顶

  7. ruby-on-rails - 负载测试期间 Unicorn CPU 使用率激增,优化方法 - 2

    我对为我的RubyonRails3.1.3应用优化我的Unicorn设置的方法很感兴趣。我目前正在高CPU超大实例上生成14个工作进程,因为我的应用程序在负载测试期间似乎受CPU限制。在模拟负载测试中,每秒大约20个请求重放请求,我的实例上的所有8个内核都达到峰值,盒子负载飙升至7-8个。每个unicorn实例使用大约56-60%的CPU。我很好奇可以通过哪些方式对其进行优化?我希望能够每秒将更多请求汇集到这种大小的实例上。内存和所有其他I/O一样完全正常。在我的测试过程中,CPU越来越低。 最佳答案 如果您受CPU限制,您希望使用

  8. 美团外卖搜索基于Elasticsearch的优化实践 - 2

    美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-BasedService(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-LengthEncoding(RLE)设计了一款高效的倒排索引结构,使检索耗时(TP99)降低了84%。本文从问题分析、技术选型、优化方案等方面进行阐述,并给出最终灰度验证的结论。1.前言最近十年,Elasticsearch已经成为了最受欢迎的开源检索引擎,其作为离线数仓、近线检索、B端检索的经典基建,已沉淀了大量的实践案例及优化总结。然而在高并发、高可用、大数据量的C端场景,目前可参考的资料并不多。因此

  9. 蓝桥杯C/C++VIP试题每日一练之报时助手 - 2

    ?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。  如果m不为0,则将时读出来,然后将分读出来,如5

  10. 基于RTS超低延时直播优化强互动场景体验 - 2

    RTS在阿里云视频直播的基础上进行底层技术优化,通过集成阿里云播放器SDK,支持在千万级并发场景下节点间毫秒级延时直播的能力,弥补了传统直播存在3~6秒延时的问题,确保了超低延时、低卡顿、秒开流畅的直播观看体验。本文介绍了基于RTS超低延迟直播优化强互动场景体验的最佳实践方案,并以阿里云播放器Aliplayer为例,详细介绍RTS超低延迟拉流接入、自动降级、排障信息获取等逻辑的实现,助力企业打造互动直播行业的产品竞争力。适用场景该方案适用于对超低延迟直播有诉求的客户,尤其是业务中存在强互动场景直播的场景。强互动场景直播主要是指对主播和观众存在互动,或观众存在更高实时性观看、画面互动需求的情况,

随机推荐