首页 > 编程语言 >L2-043 龙龙送外卖(C++, 记忆化搜索)

L2-043 龙龙送外卖(C++, 记忆化搜索)

时间:2024-05-31 17:33:34浏览次数:13  
标签:int res C++ 龙龙 送餐 外卖 dis

龙龙是“饱了呀”外卖软件的注册骑手,负责送帕特小区的外卖。帕特小区的构造非常特别,都是双向道路且没有构成环 —— 你可以简单地认为小区的路构成了一棵树,根结点是外卖站,树上的结点就是要送餐的地址。

每到中午 12 点,帕特小区就进入了点餐高峰。一开始,只有一两个地方点外卖,龙龙简单就送好了;但随着大数据的分析,龙龙被派了更多的单子,也就送得越来越累……

看着一大堆订单,龙龙想知道,从外卖站出发,访问所有点了外卖的地方至少一次(这样才能把外卖送到)所需的最短路程的距离到底是多少?每次新增一个点外卖的地址,他就想估算一遍整体工作量,这样他就可以搞明白新增一个地址给他带来了多少负担。

输入格式:

输入第一行是两个数 N 和 M (2≤N≤105, 1≤M≤105),分别对应树上节点的个数(包括外卖站),以及新增的送餐地址的个数。

接下来首先是一行 N 个数,第 i 个数表示第 i 个点的双亲节点的编号。节点编号从 1 到 N,外卖站的双亲编号定义为 −1。

接下来有 M 行,每行给出一个新增的送餐地点的编号 Xi​。保证送餐地点中不会有外卖站,但地点有可能会重复。

为了方便计算,我们可以假设龙龙一开始一个地址的外卖都不用送,两个相邻的地点之间的路径长度统一设为 1,且从外卖站出发可以访问到所有地点。

注意:所有送餐地址可以按任意顺序访问,且完成送餐后无需返回外卖站

输出格式:

对于每个新增的地点,在一行内输出题目需要求的最短路程的距离。

输入样例:

7 4
-1 1 1 1 2 2 3
5
6
2
4

输出样例:

2
4
4
6

思路:

本题思路不是很难,就是记忆化搜索。

代码:

#include <iostream>

using namespace std;

const int N = 1e5 + 10;

int m, n, res, maxl;
int t[N], dis[N];

int dfs(int x, int d) {
    if (t[x] == -1 || dis[x]) {
        maxl = max(maxl, d + dis[x]);
        return d;
    }
    int res = dfs(t[x], d + 1);
    dis[x] =dis[t[x]] + 1;
    return res;
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) cin >> t[i];
    while (m -- ) {
        int x;
        cin >> x;
        res += dfs(x, 0) * 2;
        cout << res - maxl << endl;
    }
}

标签:int,res,C++,龙龙,送餐,外卖,dis
From: https://blog.csdn.net/chq66666/article/details/139350018

相关文章

  • c++正则表达式汇总
    个人遇到的坑:使用''时需要携程'\'转译符号,否则匹配不正常正则表达式Regex(regularexpression)是一种强大的描述字符序列的工具。在许多语言中都存在着正则表达式,C++11中也将正则表达式纳入了新标准的一部分。一、校验数字的表达式数字:[1]$n位的数字:^\d{n}$至少n位的数字:^\d{......
  • C++系列-模板初阶
    ......
  • 微信小程序源码-外卖系统的计算机毕业设计(附演示视频+源码+LW)
    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • C++向C#传结构体
    在写项目的时候,我需要将C++中接收到的结构体传输到我的C#项目中使用。结构体中基本是int,int[],float类型数据,这些类型在C++和C#中是一样的,可以直接传输,但是结构体怎么传输呢?下面是简单示例:MyStruct.hextern"C"{#pragmapack(1) typedefstruct_data1{ intid[4];......
  • C++ vector 避免 fill 0
    我们在profiler的时候有的时候发现memset占用热点比较高。而且是std::vector::resize带来的。这个明显是没必要的,例如:std::vector<int>result;//这里resize会fill0result.resize(input_rows);for(inti=0;i<input_rows;++i){result[i]=transfer(input[i])......
  • 小猴编程周赛C++ | 金币
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】猴博士将金币作为工资,发给实验室的员工。员工入职后第一个月,收到一枚金币;之后两个月(第二个月和第三个月),每个月收到两枚金......
  • c++ NULL nullptr 区别
     C++中NULL和nullptr的区别在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题,为了弄明白这个问题,我查找了一些资料,总结如下。一、C程序中的NULL......
  • 深入理解 C++ 的 deque 容器
    一、deque概述vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,如下所示。vector也可以在头尾两端进行操作,但是其头部操作效率奇差,无法被接受。deque和vector的最大差异,一在于deque允许......
  • C++ IO流:控制台输入输出
    C++输入输出头文件#include<iostream>,常用于控制台打印/OJ数据读取分别对应:控制台IO流/文件流/字符串流,本文主要介绍控制台输出输出流cin>>空格分隔cout<<控制台输出已知待读取元素的数量:cin>>n未知待读取元素的数量:while(cin>>val)另外,可以整行读取数据,然......
  • C++数据结构之:栈Stack
    摘要:  it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储......