华为OD机试 - BOSS的收入 - 回溯(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

一个XX产品行销总公司,只有一个boss,其有若干一级分销,一级分销又有若干二级分销,每个分销只有唯一的上级分销.
规定,每个月,下级分销需要将自己的总收入 (自己的+下级上交的) 每满100元上交15元给自己的上级。

现给出一组分销的关系,和每个分销的收入,请找出boss并计算出这个boss的收入。

比如:

  1. 收入100元上交15元;
  2. 收入199元(99元不够100)上交15元;
  3. 收入200元,上交30元。

二、输入描述

分销关系和收入: [[分销id 上级分销的ld 收入,[分销id 上级分销的id 收入],[分销id 级分销的id 收入]]

提示:

输入的数据只存在1个boss,不存在环路

三、输出描述

[boss的ID,总收入]

四、解题思路

  1. 第一行输入“分销关系和收入”的组数num;
  2. 第二行起,开始输入num行“分销id 上级分销的id 收入”;
  3. 定义经销商收入关联集合mapList,key:顶级父节点,value:[{子节点1:收入},{子节点2:收入}];
  4. 初始化经销商收入关联集合mapList;
  5. 获取BOSS节点,根据题意,没做过子节点的父节点就是boss;
  6. 获取boss的收入;
    • 如果不是boss经销商;
      • 计算上一级经销商的钱;
      • 获取上一级经销商的下级经销商的钱;
        • 获取下级经销商的钱;
      • 如果子经销商还有子经销商,则要将其的利润加到上一级经销商
      • 满100提15;
    • 如果是最终boss经销商,直接计算总money;
  7. 输出[boss的ID,总收入];

五、Java算法源码

package com.guor.od;import java.util.*;public class OdTest02 {/*** 经销商收入关联集合** key:顶级父节点* value:[{子节点1:收入},{子节点2:收入}]*/static Map<Integer, List<Map<Integer, Integer>>> mapList = new HashMap<Integer, List<Map<Integer, Integer>>>();static int bossId;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num = Integer.parseInt(sc.nextLine());List<Integer> sonList = new ArrayList<>();List<Integer> fatherList = new ArrayList<>();for (int i = 0; i < num; i++) {// id 上级id 收入String[] str = sc.nextLine().split(" ");int sonId = Integer.parseInt(str[0]);int fatherId = Integer.parseInt(str[1]);int income = Integer.parseInt(str[2]);sonList.add(sonId);fatherList.add(fatherId);Map<Integer, Integer> map = new HashMap<>();map.put(sonId, income);if (mapList.containsKey(fatherId)) {mapList.get(fatherId).add(map);} else {List<Map<Integer, Integer>> maps = new ArrayList<>();maps.add(map);mapList.put(fatherId, maps);}}// 根据题意,没做过子节点的父节点就是bossbossId = findBossId(sonList, fatherList);// 经销商收入关联集合System.out.println(mapList);// 获取boss的收入getBossMoney(bossId, bossId);// 输出[boss的ID,总收入]System.out.println(bossId+" "+bossSum);}/*** 根据题意,没做过子节点的父节点就是boss* @param sonList 子节点集合* @param fatherList 父节点集合* @return 顶级父节点boss*/public static Integer findBossId(List<Integer> sonList, List<Integer> fatherList) {for (Integer pId : fatherList) {if(!sonList.contains(pId)){return pId;}}return null;}// 找出某个子节点的子经销商的提成static Integer bossSum = 0;/*** 递归获取boss的收入* @param id 当前经销商* @param fatherId 上一级经销商* @return*/public static Integer getBossMoney(int id, int fatherId) {// 如果不是boss经销商if (id != bossId) {int money = 0;// 计算上一级经销商的钱if (mapList.containsKey(fatherId)) {// 获取上一级经销商的下级经销商的钱for (Map<Integer, Integer> map : mapList.get(fatherId)) {// 获取下级经销商的钱if(map.containsKey(id)){money = map.get(id);break;}}}// 如果子经销商还有子经销商,则要将其的利润加到上一级经销商if (mapList.containsKey(id)) {for (Map<Integer, Integer> map : mapList.get(id)) {money += getBossMoney(map.keySet().iterator().next(), id);}}// 满100提15return (money / 100) * 15;} else {// 如果是最终boss经销商,直接计算总moneyfor (Map<Integer, Integer> map : mapList.get(bossId)) {int next = map.keySet().iterator().next();bossSum += getBossMoney(next, bossId);}}return 0;}
}

六、效果展示

1、输入

6
1 0 299
2 0 299
3 1 389
4 2 479
5 2 199
6 4 799

2、输出

0 90

3、说明

0是顶级boss经销商
6上交15 * 7 = 105 到4
5上交15 * 1 到2
4上交15 * 4 到2
3上交15 * 3 到1

2变成299+15+60=374

1变成299+45=344

2上交153到0
1上交15
3到0

0作为boss,最终获得90。

这BOSS真的是不赚钱啊,良心企业家,哈哈。

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/70745.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

appium2 安装 和出现问题解决

1.安装环境 A macOS, Linux, or Windows operating systemNode.js version in the SemVer range ^14.17.0 || ^16.13.0 || >=18.0.0NPM version >= 8 (NPM is usually bundled with Node.js, but can be upgraded independently) 1.1只要安装nodejs最新版就好了 1.2安…

国内的PMP有多少含金量?

1.PMP是什么 PMP&#xff08;Project Management Professional&#xff09;指项目管理专业人士资格认证。它是由美国项目管理协会&#xff08;PMI&#xff09;举办的项目管理专业人员&#xff08;PMP&#xff09;认证考试&#xff0c;在全球190多个国家和地区推广&#xff0c;…

简单记录牛客top101算法题(初级题C语言实现)BM24 二叉树的中序遍历 BM28 二叉树的最大深度 BM29 二叉树中和为某一值的路径

1. BM24 二叉树的中序/后续遍历 要求&#xff1a;给定一个二叉树的根节点root&#xff0c;返回它的中序遍历结果。                          输入&#xff1a;{1,2,#,#,3} 返回值&#xff1a;[2,3,1]1.1 自己的整体思路&#xff08;与二叉树的前序遍…

我们为什么需要API管理系统?

我们为什么需要API管理系统&#xff1f; 随着web技术的发展&#xff0c;前后端分离成为越来越多互联网公司构建应用的方式。前后端分离的优势是一套Api可被多个客户端复用&#xff0c;分工和协作被细化&#xff0c;大大提高了编码效率&#xff0c;但同时也带来一些“副作用”:…

macOS(m1/m2)破解Sublime Text和Navicat16

破解Sublime Text 说明&#xff1a;全程使用的是终端操作 1. 下载Sublime Text&#xff0c;建议使用brew下载 2. 进入到下载的app的文件夹 cd "/Applications/Sublime Text.app/Contents/MacOS/"3. 执行以下操作以确认版本是否匹配 md5 -q sublime_text | grep -i…

Spring 框架入门介绍及IoC的三种注入方式

目录 一、Spring 简介 1. 简介 2. spring 的核心模块 ⭐ 二、IoC 的概念 2.1 IoC 详解 2.2 IoC的好处 2.3 谈谈你对IoC的理解 三、IoC的三种注入方式 3.1 构造方法注入 3.2 setter方法注入 3.3 接口注入&#xff08;自动分配&#xff09; 3.4 spring上下文与tomcat整…

二十二、策略模式

目录 1、项目需求2、传统方案解决鸭子问题的分析和代码实现3、传统方式实现存在的问题分析和解决方案4、策略模式基本介绍5、使用策略模式解决鸭子问题6、策略模式的注意事项和细节7、策略模式的使用场景 以具体项目来演示为什么需要策略模式&#xff0c;策略模式的优点&#x…

【高阶数据结构】AVL树详解

文章目录 前言1. AVL树的概念2. AVL树结构的定义3. 插入&#xff08;仅仅是插入过程&#xff09;4. 平衡因子的更新4.1 为什么要更新平衡因子&#xff1f;4.2 如何更新平衡因子&#xff1f;4.3 parent更新后&#xff0c;是否需要继续往上更新&#xff1f;4.4 平衡因子更新代码实…

6G 特点及表现

6G R&D Vision: Requirements and Candidate Technologies 5G已经提出来了大移动带宽&#xff0c;低时延和大规模机器互联&#xff0c;在这个基础上&#xff0c;6G加上了高可靠性&#xff0c;高定位精度和高智能化。 6G的主要候选技术&#xff0c;包括(子) THz 通信&#x…

微信小程序前后端开发快速入门(完结篇)

这篇是微信小程序前后端快速入门完结篇了&#xff0c;今天利用之前学习过的所有知识做一个新的项目「群登记助手v1.0」小程序。 整体技术架构&#xff1a;小程序原生前端小程序云开发。 经历了前面教程的学习&#xff0c;大家有了一定的基础&#xff0c;所以本次分享重心主要是…

【日常积累】HTTP和HTTPS的区别

背景 在运维面试中&#xff0c;经常会遇到面试官提问http和https的区别&#xff0c;今天咱们先来简单了解一下。 超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息&#xff0c;HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果…

《QT+PCL》点云的点选与框选

《QT+PCL》点云的点选与框选 效果展示关键代码对应Qt6与pcl1.13对应Qt6与pcl1.12对应Qt5与pcl1.12对应Qt5与pcl1.11资源效果展示 关键代码 对应Qt6与pcl1.13 点选 //点选--------------回调函数 void MainWindow::pp_callback_PointsSelect(const