题目:

  主办方设计了一个获取食物的游戏,游戏的地图由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;
}

华为2023暑期笔试(1-2)相关推荐

  1. 2023暑期实习历程总结

    一.前言 Hello 大家好久不见,已经三个月左右没有更新了,那我这三个月在干什么呢?自2023年3月中旬开始到现在五月底这期间接近三个月的时间里,我一直在进行2023暑期实习的投递和面试.这期间投递 ...

  2. 最新九月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试三十题

    最新九月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试三十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过. ...

  3. 华为c语言笔试形式,最新华为C语言笔试题目分享

    最新华为C语言笔试题目分享 华为C语言笔试题目分享: 一.判断 1.有数组定义inta[2][2]={{1},{2,3}};则a[0][1]的值为0.() 2.int(*ptr)(),则ptr是一维数 ...

  4. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.29)

    文章出处:http://blog.csdn.net/v_july_v/article/details/7974418 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 (参与算法&面 ...

  5. 2022-8-24 华为秋招笔试

    2022-8-24 华为秋招笔试 这次主要简单讲一下前两题,具体题目记不清了,大家可以在网上找到. T1 思路:(我刚开始想的是排序完求排序差分数组的前缀和,不过其实原理差不多) 前缀和(感觉跟那个接 ...

  6. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.23)

    引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过.正如上一篇文章支持向量机通俗导论(理解SVM的三层境界)末尾 ...

  7. 2013九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试题

    九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过. ...

  8. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试五十题

    九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试五十题 (欢迎加入十月面试题集训组,参与讨论&解题:193308452) 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久), ...

  9. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题(10.11)

    九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题 引言 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔/面试五十题 后记 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题 (参与面 ...

最新文章

  1. bootstrap的php写在哪里,bootstrap用什么编辑器写
  2. python面试-python面试问题集锦
  3. js控制Iframe 和 iframe与主页的交互,传值 (转载)
  4. 各数据结构算法时间复杂度图【笔记自用】
  5. 天天用 Spring,bean 实例化原理你懂吗?
  6. 音视频技术开发周刊 | 145
  7. Linux系统文件有三个主要的时间属性,分别是ctime(change time), atime(access time), mtime(modify time)...
  8. Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable
  9. 同事都说有SQL注入风险,我非说没有
  10. Spark SQL 简介
  11. Android Studio如何添加jar包
  12. Spring Cloud Config客户端使用
  13. linux找不到mysql服务_linux mysql 找不到 mysql/mysql.h
  14. 软件测试的测试数据分析,软件测试结果归纳与分析
  15. JS GZIP压缩,GZIP解压
  16. 使用 DiskMaker X 轻松制作 Yosemite 安装 U 盘(引)
  17. Python无法打开.xlsx文件:xlrd.biffh.XLRDError: Excel xlsx file; not supported
  18. AI走向“战争技术”,是减少损伤还是推向灾难
  19. CST816S触摸驱动
  20. 结构健康监测平台发展现状

热门文章

  1. Error response from daemon: You cannot remove a running container 8c03b6c4da31d435bcaf8c4a6c59938c3b
  2. Common-Collections3
  3. ERP(Enterprise Resource Planning)/企业资源计划
  4. phpstorm 插件
  5. 今日头条2018校招后端方向(第二批)
  6. 计算机专业开学周记,周记开学第一周
  7. 已知IP和子网掩码,计算网络号、主机号、子网个数、可容纳的主机数
  8. 分布式系统(事务处理)
  9. laravel银联支付
  10. activiti 流程实例与业务关联