2024华为OD机考E卷100分题 - boss的收入

最新华为OD机试

题目描述

一个XX产品行销总公司,只有一个boss,其有若干一级分销,一级分销又有若干二级分销,每个分销只有唯一的上级分销。

规定,每个月,下级分销需要将自己的总收入(自己的+下级上交的)每满100元上交15元给自己的上级。

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

比如:

  • 收入100元,上交15元;
  • 收入199元(99元不够100),上交15元;
  • 收入200元,上交30元。

输入:

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

  • 分销ID范围: 0…65535
  • 收入范围:0…65535,单位元

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

输出:

[boss的ID, 总收入]

输入描述

第一行输入关系的总数量 N
第二行开始,输入关系信息,格式:

分销ID 上级分销ID 收入

比如:

5  
1 0 100  
2 0 199  
3 0 200  
4 0 200  
5 0 200
123456

输出描述

输出:

boss的ID 总收入

比如:

0 120

备注

给定的输入数据都是合法的,不存在环路,重复的

示例一

输入

5
1 0 100
2 0 199
3 0 200
4 0 200
5 0 200
123456

输出

0 120
1

说明

题解思路

题目解释

这个题目描述了一个分销网络的收入上交机制,并要求我们找到网络中的boss节点(即没有上级的分销节点),然后计算出这个boss节点的总收入。

题目细节
  • 分销网络:这是一个树形结构,每个分销节点都有一个唯一的上级分销。需要注意的点:唯一没有上级分销的节点就是boss节点。
  • 收入上交规则
    • 每个分销节点在每月需要将其总收入中每满100元上交15元给它的上级分销。
    • 如果一个分销节点有下级分销,那么下级分销上交的收入也算作该分销的收入的一部分。
示例分析

输入:

5
1 0 100
2 0 199
3 0 200
4 0 200
5 0 200
123456

解释:

  • 0号分销是boss,因为其他分销都将收入上交给0
  • 1号分销的收入是100元,上交15元给0
  • 2号分销的收入是199元,上交15元给0
  • 3号、4号和5号分销的收入各是200元,分别上交30元给0

boss的总收入计算:

  • 收到的上交收入:15 + 15 + 30 + 30 + 30 = 120 元。

输出:

0 120
1

Java

import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
   
   

    public static void main(String[] args) {
   
   
        Scanner sc = new Scanner(System.in);

        // 读取分销关系的数量
        int n = Integer.parseInt(sc.nextLine().trim());

        // 记录每个分销商的收入
        HashMap<Integer, Long> income = new HashMap<>();
        // 记录所有的分销商 ID
        HashSet<Integer> ids = new HashSet<>();
        // 记录子分销商到父分销商的映射关系
        HashMap<Integer, Integer> childToParent = new HashMap<>();
        // 记录父分销商到其所有子分销商的映射关系
        HashMap<Integer, LinkedList<Integer>> parentToChildren = new HashMap<>();

        // 读取输入数据并构建映射关系
        for (int i = 0; i < n; i++) {
   
   
            // 读取当前行
            String[] parts = sc.nextLine().split(" ");
            // 解析当前子分销商的 ID
            int childId = Integer.parseInt(parts[0]);
            // 解析当前子分销商的父分销商 ID
            int parentId = Integer.parseInt(parts[1]);
            // 解析当前子分销商的收入
            long childIncome = Long.parseLong(parts[2]);

            // 将子分销商的收入记录在 income 映射中
            income.put(childId, childIncome);
            // 将子分销商和父分销商的 ID 添加到分销商 ID 集合中
            ids.add(childId);
            ids.add(parentId);

            // 记录子分销商到父分销商的映射关系
            childToParent.put(childId, parentId);

            // 如果父分销商还没有子分销商列表,则初始化一个新的列表
            parentToChildren.putIfAbsent(parentId, new LinkedList<>());
            // 将当前子分销商 ID 添加到父分销商的子分销商列表中
            parentToChildren.get(parentId).add(childId);
        }

        // 寻找顶级分销商 (即没有父分销商的分销商,即 boss)
        for (int id : ids) {
   
   
            // 如果当前分销商 ID 不在 childToParent 映射中,说明它是顶级分销商
            if 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值