PTA: 龙龙送外卖

2023-12-15 12:30
文章标签 外卖 pta 龙龙

本文主要是介绍PTA: 龙龙送外卖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

输入样例:
7 4
-1 1 1 1 2 2 3
5
6
2
4
输出样例:
2
4
4
6

思路

看题目首先知道要把树给建起来,直接按照题目给出的信息建出来的树是很可能是反向的 ,至少我一开始反向的 。 但是为了便于求每个节点的深度,我们需要再建一个正向的树。反向的树由于每个节点对应的父节点只有一个,所以我选择用哈希表来存;正向的树每个父节点对应两个叶子结点,所以我选择了链式前向星来存。
题目要求的结果是什么呢?其实就是当前所有加入的节点连通根节点构成的树上的所有的边的数目*2-最深的节点的深度。这个其实是一个简单的贪心思想,根据题意我们知道,龙龙每次送完外卖再去送下一个地方时,需要先移动到这两个地方的最近公共祖先,那么当前节点到最近公共祖先这一条路就走了两次,由于龙龙送完最后一趟外卖后不需要回到根节点,那么要使龙龙走的总距离最短,我们只需要让他深度最深的那一条路只走一次就行了(这个结论虽然在pta上验证是正确的,但是我还没有想到严格的证明,希望有想法的小伙伴和我交流一下)

AC代码

#include <bits/stdc++.h>using namespace std;
const int maxn = 1e5+5;
struct edge {int to, next;
} edges[maxn];
int head[maxn];
int tot = -1;
bool vis[maxn];
int root;void add(int u, int v) {if(u < 0) {root = v; return;}  //  处理根节点++tot;edges[tot].to = v;edges[tot].next = head[u];head[u] = tot;
}
unordered_map<int, int> tree;
int height[maxn];
void pre(int cur, int de) {  // 前序遍历求每个节点的深度if(cur != -1) {height[cur] = de;for(int i = head[cur]; i != -1; i = edges[i].next) {pre(edges[i].to, de+1);}}
}int main(void)
{freopen("in.txt", "r", stdin);memset(head, -1, sizeof(head));memset(vis, 0, sizeof(vis));int N, M;scanf("%d%d", &N, &M);int u;for(int i = 1; i <= N; ++i) {scanf("%d", &u);add(u, i);  // 添加正向边tree[i] = u;  // 添加反向边}pre(root, 0);int totedge = 0;  // 当前生成树的总边树int maxdepth = 0;  // 最深的深度bool flag = true;for(int i = 0; i < M; ++i) {scanf("%d", &u);maxdepth = max(maxdepth, height[u]);while(tree[u] != -1 && !vis[u]) {vis[u] = true;++totedge;u = tree[u];}if(flag) flag = false;else printf("\n");printf("%d", totedge*2-maxdepth);}return 0;
}

这篇关于PTA: 龙龙送外卖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/496459

相关文章

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

实习项目|苍穹外卖|day7

缓存菜品 1.根据原型进行需求分析与设计(接口文档) 2.根据接口设计DTO(redis数据类型选取) 3.编码controller-》service-》mapper @GetMapping("/list")@ApiOperation("根据分类id查询菜品")public Result<List<DishVO>> list(Long categoryId) {//判断缓存

[苍穹外卖]-04菜品管理接口开发

效果预览 新增菜品 需求分析 查看产品原型分析需求, 包括用到哪些接口, 业务的限制规则 业务规则 菜品名称必须是唯一的菜品必须属于某个分类下, 不能单独存在新增菜品时可以根据情况选择菜品的口味每个菜品必须对应一张图片 接口设计 根据类型查询分类接口 文件上传接口 新增菜品接口 数据表设计 设计dish菜品表 和 dish_fl

SpringBoot登录退出|苍穹外卖登录退出分析

文章目录 概要整体流程注意事项一、拦截路径二、token三、注册防止用户重复提交 苍穹外卖登录退出分析注意解决JWT退出后依然有效的问题 概要 结合Spring Boot和Vue3实现安全的用户登录和退出功能,并使用拦截器、JWT和Redis缓存来提高系统的安全性和性能。 整体流程 注意事项 一、拦截路径 像登录页面的路径就不要拦截了,否则都不能登录了 例如:

Java项目——苍穹外卖(一)

Entity、DTO、VO Entity(实体) Entity 是表示数据库表的对象,通常对应数据库中的一行数据。它通常包含与数据库表对应的字段,并可能包含一些业务逻辑。 DTO(数据传输对象) 作用:DTO 是用于在不同层之间传输数据的对象,通常用于网络传输或服务间调用。DTO 主要用于减少网络请求的次数,携带数据而不包含业务逻辑。特点:DTO类通常只包含数据字段和相应的getter和s

苍穹外卖学习笔记(一)

文章目录 开发环境搭建一. 前端环境搭建二. 后端环境搭建1.进入idea项目2.提交git仓库(+推送github远程仓库)3.数据库环境搭建4.前后端联调(在源代码中项目已经实现登录功能)nginx反向代理好处: 三. 完善登录功能(md5加密存储)1.首先打开pojo模块中实体类的employee,添加salt字段2.在数据库中employee表新建一个salt字段,注意得是字符串类

pta-2024年秋面向对象程序设计实验一-java

文章申明:作者也为初学者,解答仅供参考,不一定是最优解; 一:7-1 sdut-sel-2 汽车超速罚款(选择结构) 答案: import java.util.Scanner;         public class Main { public static void main(String[] arg){         Scanner sc=new Scanner(System

2024霸王餐小程序cps,h5公众号小程序开源版系统搭建开发,外卖霸王餐小程序系统源码

目录 前言: 一、霸王餐小程序的操作是怎么样的? 二、霸王餐系统后台 三、怎么搭建部署? 前言: 霸王餐项目基于美团和饿了么平台开发的小程序。 一、霸王餐小程序的操作是怎么样的? 1、进入小程序后选择自己要下单的店铺,点击去抢单,点击立即抢单。 2、输入平台外卖绑定的手机号,点击确认报名。按照步骤操作即可。 3、等待外卖送达后,完成评价即可。 二、霸王餐系统后台

实习项目|苍穹外卖|day5

复习Redis 原来也是跟着黑马学的redis,教程里的项目是点评网站。(也忘记的差不多了) 这里先自己复习一下如何安装和使用。 1.环境 (也有windows版本) 目前来说肯定是在linux(这里使用虚拟机的方式,按照韩顺平老师的linux教程的环境Linux版本为CentOS 7) Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:yum install

【苍穹外卖】Day 5 Redis、店铺营业状态接口

1 基本介绍 Redis是一个基于 内存 的 key-value 结构数据库 基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛 运行 在cmd下 redis-server.exe redis.windows.conf 启动状态下,再 redis-cli.exe 测试: 也可以 redis-cli.exe -h localh