华为2023暑期笔试(1-2)
题目:
主办方设计了一个获取食物的游戏,游戏的地图由N个方格组成,每个方格上至多2个传送门,通过传送门可将参与者传送至指定的其它方格。同时,每个方格上标注了三个数字:
- 第一个数字id:代表方格的编号,从0到 N-1,每个方格各不相同;
- 第二个数字parent-id: 代表从编号为parent-id的方格可以通过传送门传送到当前方格(-1则表示没有任何方格可以通过传送门传送到此方格,这样的方格在地图中有且仅有一个) ;
- 第三个数字value: 取值在[-100,100]的整数值,正整数代表与者得到相应数值单位的食物,负整数代表失去相应数值单位的食物(参与者可能存在临时持有食物为负数的情况),0则代表无变化。
此外,地图设计时保证了参与者不可能到达相同的方格两次,并且至少有一个方格的value是正整数。游戏开始后,参与者任意选择一个方格作为出发点,当遇到下列情况之退出游戏。请计算参与者退出游戏后,最多可以获得多少单位的食物。
- 参与者当前所处的方格无传送门;
- 参与者在任意方格上主动宣布退出游戏
输入:
第一行: 方块个数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;
}
华为2023暑期笔试(1-2)相关推荐
- 2023暑期实习历程总结
一.前言 Hello 大家好久不见,已经三个月左右没有更新了,那我这三个月在干什么呢?自2023年3月中旬开始到现在五月底这期间接近三个月的时间里,我一直在进行2023暑期实习的投递和面试.这期间投递 ...
- 最新九月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试三十题
最新九月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试三十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过. ...
- 华为c语言笔试形式,最新华为C语言笔试题目分享
最新华为C语言笔试题目分享 华为C语言笔试题目分享: 一.判断 1.有数组定义inta[2][2]={{1},{2,3}};则a[0][1]的值为0.() 2.int(*ptr)(),则ptr是一维数 ...
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.29)
文章出处:http://blog.csdn.net/v_july_v/article/details/7974418 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 (参与算法&面 ...
- 2022-8-24 华为秋招笔试
2022-8-24 华为秋招笔试 这次主要简单讲一下前两题,具体题目记不清了,大家可以在网上找到. T1 思路:(我刚开始想的是排序完求排序差分数组的前缀和,不过其实原理差不多) 前缀和(感觉跟那个接 ...
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.23)
引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过.正如上一篇文章支持向量机通俗导论(理解SVM的三层境界)末尾 ...
- 2013九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试题
九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过. ...
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试五十题
九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试五十题 (欢迎加入十月面试题集训组,参与讨论&解题:193308452) 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久), ...
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题(10.11)
九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题 引言 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔/面试五十题 后记 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题 (参与面 ...
最新文章
- bootstrap的php写在哪里,bootstrap用什么编辑器写
- python面试-python面试问题集锦
- js控制Iframe 和 iframe与主页的交互,传值 (转载)
- 各数据结构算法时间复杂度图【笔记自用】
- 天天用 Spring,bean 实例化原理你懂吗?
- 音视频技术开发周刊 | 145
- Linux系统文件有三个主要的时间属性,分别是ctime(change time), atime(access time), mtime(modify time)...
- Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable
- 同事都说有SQL注入风险,我非说没有
- Spark SQL 简介
- Android Studio如何添加jar包
- Spring Cloud Config客户端使用
- linux找不到mysql服务_linux mysql 找不到 mysql/mysql.h
- 软件测试的测试数据分析,软件测试结果归纳与分析
- JS GZIP压缩,GZIP解压
- 使用 DiskMaker X 轻松制作 Yosemite 安装 U 盘(引)
- Python无法打开.xlsx文件:xlrd.biffh.XLRDError: Excel xlsx file; not supported
- AI走向“战争技术”,是减少损伤还是推向灾难
- CST816S触摸驱动
- 结构健康监测平台发展现状
热门文章
- Error response from daemon: You cannot remove a running container 8c03b6c4da31d435bcaf8c4a6c59938c3b
- Common-Collections3
- ERP(Enterprise Resource Planning)/企业资源计划
- phpstorm 插件
- 今日头条2018校招后端方向(第二批)
- 计算机专业开学周记,周记开学第一周
- 已知IP和子网掩码,计算网络号、主机号、子网个数、可容纳的主机数
- 分布式系统(事务处理)
- laravel银联支付
- activiti 流程实例与业务关联