PTA L2-043龙龙送外卖

这篇具有很好参考价值的文章主要介绍了PTA L2-043龙龙送外卖。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

4.1.6 L2-043龙龙送外卖

  • 题目地址:https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582482059845632

  • 题目概述:

    这是一道关于求树中各个结点深度的题,两种方法:用DFS(将输入转为孩子表示法);用回溯法(从结点往上找双亲结点统计出结点的距离)。题目每新增一个外卖点,就是将之前的点一起结合起来探寻最短路径。

    首先这是一棵树,单看每个结点它自己的最短路径就是自身的深度-1(根结点深度为1),所以主要问题就是怎么合理安排这些外卖点的访问顺序让总体送外卖的距离最短。

    因为可能有些点不在同一个分支上,就会造成访问完然后再返回到分支处访问另一个结点。可以确定的是每个结点到外卖点的距离是唯一的,所以我们要做的就是让外卖员返回的路程尽量的少,因为最后不需要返回到外卖点,所以我们可以将深度最深的点留到最后去找,这样就不需要再返回一次增加额外更多的距离了。

  • 主要操作:

    采用的是回溯法求结点,不过会将回溯过程中经过的结点顺便求出它的深度。需要一个max值存储前一次的最大深度,这决定了哪条分支会最后被访问。

    1. 要是本身这个点前面就求出了深度了,说明这个点送外卖时肯定访问过,而题目又说送的顺序任意,所以直接就先送这个,那么距离就不会增加(与该点之前求得的距离相同)。
    2. 要是整条路都没遇到已经求过的点,说明这条分支从未被访问过。如果此点的距离>max,,那就需要从max点返回再走向当前点。如果此点的距离<=max,说明该点先需要被访问,回去再回到外卖点,两倍的该点的距离(深度-1)
    3. 要是遇到一个点回溯过程中遇到已知深度的点,就可以结束回溯,直接将已知深度 与 目前回溯的步数相加即可得到所求点的深度。此时会出现出现2种情况。
      1. max<当前点距离,说明此时当前点应该最后被访问,max点必须再走一遍max距离回到外卖点再到当前点。而上一次的情况,当前点这个分支(碰到已知深度的点作为分叉点)到外卖点肯定多走了一次,需要减去一次,然后再加上分叉点到当前的距离即可。
      2. max>=当前点距离,说明这个点需要来回两次(不是最后被访问),所以直接上一次情况+2倍的分叉点到当前的距离。
  • 代码:文章来源地址https://www.toymoban.com/news/detail-437960.html

    #include <iostream>
    using namespace std;
    /*
        以后不管怎么样,尽量把数组开大点。
    */
    int N, M;
    int node[100010];
    // int inRoad[100010];
    int level[100010];
    int temp[100010];
    int main()
    {
        cin >> N >> M;
        for (int i = 1; i <= N; i++)
        {
            cin >> node[i];
        }
    
        int max = 0;
        int sumOfRoadDis = 0;
        int count2Root = 0, count2Same = 0;
        int point = M;
        int x;
        while (point--)
        {
            count2Root = 0;
            count2Same = 0;
            cin >> x;
            int parent = x;
            // 说明访问过,直接输出先前的距离
            if (level[x] != 0)
            {
                cout << sumOfRoadDis << endl;
                continue;
            }
    
            // 从这个点的父亲开始访问循环
            // 这个是最花时间的
            while (parent != -1)
            {
                if (level[parent] == 0)
                {
                    temp[count2Same] = parent;
                    // inRoad[parent] = 1;
                    count2Same++;
                }
                else
                {
                    break;
                }
                count2Root++;
                parent = node[parent];
            }
    
            // 得到了从外卖点到x的路径长度,也确定了途中经过的点。
            // 此时parent的值要么为-1,要么这个parent是被访问过的,并且它的距离也知道。
    
            if (parent == -1)
            {
                int length = count2Same - 1;
                for (int i = 0; i < count2Same - 1; i++)
                {
                    level[temp[i]] = length;
                    length--;
                }
            }
            else
            {
                int length = count2Same;
                for (int i = 0; i < count2Same; i++)
                {
                    level[temp[i]] = level[parent] + length;
                    length--;
                }
            }
            count2Root = level[x] + 1;
    
            // 说明途中压根就没遇到经过点
            if (count2Root == count2Same)
            {
                count2Root--;
                if (count2Root > max)
                {
                    sumOfRoadDis = sumOfRoadDis + max + count2Root;
                }
                else
                {
                    sumOfRoadDis = sumOfRoadDis + 2 * count2Root;
                }
            }
            // 说明经过了点。
            else
            {
                count2Root--;
                if (count2Root <= max)
                {
                    sumOfRoadDis += count2Same * 2;
                }
                else
                {
                    sumOfRoadDis += max - count2Root + count2Same * 2;
                }
            }
            cout << sumOfRoadDis << endl;
            if (count2Root > max)
            {
                max = count2Root;
            }
        }
        return 0;
    }
    

到了这里,关于PTA L2-043龙龙送外卖的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • L2-041 插松枝PTA

    人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的: 每人手边有一只小盒子,初始状态为空。 每人面前有用不完的松枝干和一个推送器,每次推送一片随机型号的松针片。 工人首先捡起一根空的松枝干

    2023年04月15日
    浏览(33)
  • PTA L2-048 寻宝图

    给定一幅地图,其中有水域,有陆地。被水域完全环绕的陆地是岛屿。有些岛屿上埋藏有宝藏,这些有宝藏的点也被标记出来了。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。 输入第一行给出 2 2 2 个正整数 N N N 和 M M M ( 1 N × M ≤ 1 e

    2024年02月02日
    浏览(55)
  • PTA L2-045 堆宝塔 (25 分)

    堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下: 首先准备两根柱子,一根 A 柱串宝塔,一根 B 柱用于临时叠放。 把第 1 块彩虹圈作为第 1 座宝塔的基座,在 A 柱

    2023年04月24日
    浏览(22)
  • 2023 PTA天梯赛补题(L1 & L2)

    输入输出题 输入输出题 k == n 和 k == m 分别输出,题目怎么说就怎么做 判断一下c 等于a + b还是a*b或者都不是,分别按要求输出 针对每一群玩游戏的宝宝,枚举判断一下就好了 写的有点烦,基本就是一步一步模拟,思路在注释里写了 枚举分配方案,代码中a代表女生寝室的数

    2024年02月03日
    浏览(30)
  • 【2023团体程序设计天梯赛CCCC】GPLT2023,L1~L2部分(PTA,L1-089~L1-096,L2-045~L2-048)题解代码&复盘

    概要 L1部分:L1-089~L1-096 L2部分:L2-045~L2-048 L3部分:L3-033~L3-036 L1-089 最好的文档 5 L1-090 什么是机器学习 5 L1-091 程序员买包子 10 L1-092 进化论 10 L1-093 猜帽子游戏 15 L1-094 剪切粘贴 15 L1-095 分寝室 20 L1-096 谁管谁叫爹 20 L2-045 堆宝塔 25 L2-046 天梯赛的赛场安排 L2-047 锦标赛 25 L2-048

    2024年02月01日
    浏览(33)
  • (Java)数据结构——排序(第一节)堆排序+PTA L2-012 关于堆的判断

    本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。 堆排序是一种基于堆数据结构的排序算法,其核心思想是将待排序的序列构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换,再将剩余元素重新调整为最大堆(或最小堆

    2024年04月12日
    浏览(26)
  • 实例043 如何实现Office助手

    实例说明 用过Office的人都知道,Office助手是一个非常漂亮的小工具,有了它,即使对Office不太熟悉的用户也可以操作自如。本实例使用C#制作了一个类似Office助手的程序,实例效果如图1.44所示。 技术要点 要实现Office助手效果,需要使用Microsoft提供的第3方控件。在工具箱中单

    2024年02月11日
    浏览(23)
  • 043:mapboxGL鼠标点击提示source属性信息

    第043个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中通过鼠标点击提示source属性信息。这里用到了popup弹窗,用到了click事件,用到了鼠标样式的变化等功能。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 示例效果

    2024年02月08日
    浏览(24)
  • 编程笔记 html5&css&js 043 CSS尺寸属性

    块的宽度和高度,决定了块的大小,也就是尺寸。 height 和 width 属性用于设置元素的高度和宽度。height 和 width 属性不包括内边距、边框或外边距。它设置的是元素内边距、边框以及外边距内的区域的高度或宽度。 height 和 width 属性可设置如下值: auto - 默认。浏览器计算高度

    2024年01月21日
    浏览(36)
  • 【leetcode100-042/043】【二叉树】二叉搜索树的转换和验证

    【转换】 给你一个整数数组  nums  ,其中元素已经按  升序  排列,请你将其转换为一棵  高度平衡  二叉搜索树。 高度平衡  二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 思路: 可以说是递归板子题了。每次把数组切两半,中间

    2024年01月20日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包