自己看---华为OD--boss的收入

题目描述
一个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

输出描述
输出:

boss的ID 总收入

比如: 0 120

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

用例1
输入
5
1 0 100
2 0 199
3 0 200
4 0 200
5 0 200
输出
0 120

def calculate_boss_income(N, relations):
    # 分销收入字典
    income_dict = {}
    # 上级分销ID字典
    parent_dict = {}

    # 解析输入
    for relation in relations:
        # 分销id   上级分销id   收入
        dist_id, parent_id, income = relation
        income_dict[dist_id] = income
        parent_dict[dist_id] = parent_id

    # 找到BOSS(没有上级分销的分销)
    bosses = set(parent_dict.values()) - set(parent_dict.keys())
    boss_id = bosses.pop() if bosses else None

    # 初始BOSS总收入为0
    total_income = 0

    def calculate_contribution(dist_id):
        nonlocal total_income  #非局部变量,因为后续要用到递归
        if dist_id in income_dict:
            # 获取当前分销的收入
            current_income = income_dict[dist_id]
            # 计算上交的收入
            contribution = (current_income // 100) * 15
            # 增加BOSS的总收入
            total_income += contribution

            # 找到当前分销的上级并进行递归计算
            if dist_id in parent_dict:
                parent_id = parent_dict[dist_id]
                calculate_contribution(parent_id)

    # 从所有分销开始递归计算上交收入
    for dist_id in income_dict.keys():
        calculate_contribution(dist_id)

    return [boss_id, total_income]


# 输入数据
N = int(input())
relations = []
for _ in range(N):#存储每行分销关系及信息
    line = list(map(int, input().split()))
    relations.append(line)

# 计算BOSS的ID和总收入
boss_info = calculate_boss_income(N, relations)
print(boss_info[0],boss_info[1])```

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值