华为2023暑期笔试(1-2)

news/2024/10/18 18:15:37/

题目:

  主办方设计了一个获取食物的游戏,游戏的地图由N个方格组成,每个方格上至多2个传送门,通过传送门可将参与者传送至指定的其它方格。同时,每个方格上标注了三个数字:

  1. 第一个数字id:代表方格的编号,从0到 N-1,每个方格各不相同;
  2. 第二个数字parent-id: 代表从编号为parent-id的方格可以通过传送门传送到当前方格(-1则表示没有任何方格可以通过传送门传送到此方格,这样的方格在地图中有且仅有一个) ;
  3. 第三个数字value: 取值在[-100,100]的整数值,正整数代表与者得到相应数值单位的食物,负整数代表失去相应数值单位的食物(参与者可能存在临时持有食物为负数的情况),0则代表无变化。
    此外,地图设计时保证了参与者不可能到达相同的方格两次,并且至少有一个方格的value是正整数。

  游戏开始后,参与者任意选择一个方格作为出发点,当遇到下列情况之退出游戏。请计算参与者退出游戏后,最多可以获得多少单位的食物。

  1. 参与者当前所处的方格无传送门;
  2. 参与者在任意方格上主动宣布退出游戏

输入:

第一行: 方块个数N (N <10000)
接下来输入N行(id<Nparent-id < N,),每行记录了相应方格上标注的3个数字,即id (0 <= id < 10000) 、parent-id (0 <= parent-id < 10000和value (-100<= value <= 100),例如:

3
0 -1 3
1 0 1
2 0 2

输出:

参与者最多可以获得的食物单位数,例如5,参与者从方格0出发,通过传送门到达方格2,一共可以获得3+25个单位食物,此时得到食物最多

样例:

输入:
7
0 1 8
1 -1 -2
2 1 9
4 0 -2
5 4 3
3 0 -3
6 2 -3
输出:9

解释:参与者从方格0出发,通过传送门到达方格4,再通过传送门到达方格5,一共获得8+(-2) +3=9个单位食物,得到食物最多,或者与者在游戏开始时处于方格2,直接主动宣布退出游戏,也可以获得9个单位食物。

思路:
这题的本质显然是树搜索问题。建模后用深度优先搜索(DFS) 算法解决。难点在于如何建模。由题意可得,不会经过一个点两次则图中必然没有环,又由于只有一个节点的父亲节点为空(也即-1), 则必然是一棵树。将dfs的含义定义为以从树的根节点能获得的最大的物品价值,在求解这个问题时会遍历所有树上的节点相当于枚举了以任意节点为起点获得的最大值,因此在每个节点return前对最终答案进行更新即可。

代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;int dfs(int id, vector<vector<int>> &G, vector<int> &v, vector<int>&a) {   //由于需要记录每一个节点向下的数据,按引用传递a以便修改int idMost = 0;for (int j : G[id]) {idMost = max(dfs(j, G, v, a), idMost);}a[id] = v[id] + idMost;return a[id];
}int main() {int N;							//方块个数cin >> N;vector<vector<int>> G(N);		//G[i]是编号为i的节点的子节点(i方块所能进入的方块)vector<int> v(N);				//v[i]是第i个方块的valueint root;						//记录作为根节点的方块编号for (int i = 0; i < N; i++) {	int id, parent_id, value;cin >> id >> parent_id >> value;v[id] = value;if (parent_id == -1) { root = id; } //更新rootelse G[parent_id].push_back(id);	//parent_id节点的所有子节点}vector<int> a(N);						//f[i]表示以节点i为初始位置遍历时的最大路径加权dfs(root,G,v,a);					//dfs搜索auto maxPosition = max_element(a.begin(), a.end());   // 返回的是最大值迭代器所在的位置cout << *maxPosition << endl;return 0;
}

简化为lamda函数形式:

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;int main() {int N;							//方块个数cin >> N;vector<vector<int>> G(N);		//G[i]是编号为i的节点的子节点(i方块所能进入的方块)vector<int> v(N);				//v[i]是第i个方块的valueint root;						//记录作为根节点的方块编号for (int i = 0; i < N; i++) {	int id, parent_id, value;cin >> id >> parent_id >> value;v[id] = value;if (parent_id == -1) { root = id; } //更新rootelse G[parent_id].push_back(id);	//parent_id节点的所有子节点}vector<int> a(N);						//f[i]表示以节点i为初始位置遍历时的最大路径加权function<int(int)> dfs = [&](int i) {int valMore = 0;for (int j : G[i]) valMore = max(dfs(j), valMore);a[i] = v[i] + valMore;return a[i];};dfs(root);					//dfs搜索,注意需要记录每一个节点向下的数据auto maxPosition = max_element(a.begin(), a.end());   // 返回的是最大值迭代器所在的位置cout << *maxPosition << endl;return 0;
}

http://www.ppmy.cn/news/58337.html

相关文章

【Unity-UGUI控件全面解析】| Image 图片组件详解

🎬【Unity-UGUI控件全面解析】| Image 图片组件详解一、组件介绍二、组件属性面板2.1 Image Type三、代码操作组件四、组件常用方法示例4.1 简易血条制作4.2 简易技能冷却条制作五、组件相关扩展使用5.1 Mask 遮罩💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本…

C++标准库 --- 动态内存 (Primer C++ 第五版 · 阅读笔记)

C标准库 --动态内存 (Primer C 第五版 阅读笔记&#xff09; 第12章 动态内存------(持续更新)12.1、动态内存与智能指针12.1.1、shared_ptr类12.1.2、直接管理内存12.1.3、shared_ptr和new结合使用12.1.4、智能指针和异常12.1.5、unique_ptr12.1.6、weak_ptr 12.2、动态数组1…

Elasticsearch 优化分析

Elasticsearch 优化分析 Elasticsearch 是一个分布式RESTful 风格的搜索和数据分析引擎广泛用于搜索引擎 日志分析 安全监测等领域在大数据量和高并发的场景下Elasticsearch 的性能和稳定性非常重要因此需要进行优化设计和分析 Elasticsearch 优化的重要性和目标 Elasticsea…

AI模型推理(1)——入门篇

前言 本文主要介绍AI模型推理的相关基础概念&#xff0c;为后续云原生模型推理服务的学习做准备。 初识模型部署 对于深度学习模型来说&#xff0c;模型部署指让训练好的模型在特定环境中运行的过程。相比于常规的软件部署&#xff0c;模型部署会面临更多的难题&#xff1a; …

SpringCloud微服务的熔断、限流、降级是怎么回事?

概述&#xff1a; 在开发公司商城项目时&#xff0c;由于采用的是微服务架构&#xff0c;每个模块之间使用OpenFeign组件进行通信&#xff0c;在遇到高并发时&#xff0c;为了保证系统的可用性和 可靠性&#xff0c;我们使用了阿里的Alibaba的Sentinel组件进行降级、限流和熔断…

Ubuntu连接Xshell

Ubuntu连接Xshell 1、安装ssh&#xff0c;开启服务 1、安装ssh sudo apt-get install openssl-server 2、启动ssh服务 /etc/init.d/ssh start 3、修改文件&#xff0c;允许远程登陆 sudo vi /etc/ssh/sshd_config PermitRootLogin prohibit-password #默认为禁止登录 PermitR…

QT C++开发之:重定义基础数据类型

&#xff08;1&#xff09;前言 对于C/C&#xff0c;几乎每个系统都会重定义&#xff08;typedef&#xff09;基础数据类型。 &#xff08;QT在qglobal.h中&#xff0c;MSVS在minwindef.h&#xff09;。 其目的是为了方便代码的迁移&#xff08;在各种环境之间&#xff09;。 …

「蓝桥杯」扫地机器人

扫地机器人 题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 N 个方格区域组成&#xff0c;如下图所示。 走廊内部署了 K 台扫地机器人&#xff0c;其中第 i 台在第 A_i 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中&#xff0c;并将该区域清扫干…