news 2026/6/9 19:46:20

(新卷,100分)- 金字塔,BOSS的收入(Java JS Python)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,100分)- 金字塔,BOSS的收入(Java JS Python)

(新卷,100分)- 金字塔,BOSS的收入(Java & JS & Python)

题目描述

微商模式比较典型,下级每赚 100 元就要上交 15 元,给出每个级别的收入,求出金字塔尖上的人收入。

输入描述

第一行输入N,表示有N个代理商上下级关系
接下来输入N行,每行三个数:

代理商代号 上级代理商代号 代理商赚的钱

输出描述

输出一行,两个以空格分隔的整数,含义如下

金字塔顶代理商 最终的钱数

用例
输入3
1 0 223
2 0 323
3 2 1203
输出

0 105

说明

2的最终收入等于323 + 1203/100*15=323 + 180

0的最终收入等于(323 + 180 + 223)/ 100 * 15 = 105

输入4
1 0 100
2 0 200
3 0 300
4 0 200
输出0 120
说明
题目解析

本题的代理商结构其实就是一个树形结构,树根就是顶级代理商。

因此,本题要求顶级代理商的钱,其实就是一个深搜过程,即每个父级代理商的钱 要从其所有子级商汲取(每100元抽15元)。

本题的难点在于,不知道树根是哪个?即不知道顶级代理商号是多少。

我的解题思路如下:

  • 定义一个income字典,其key是代理商号,val是该代理商赚的钱
  • 定义一个agents集合来记录所有出现过的代理商号
  • 定义一个ch_fa字典,其key是子级代理商,val是父级代理商
  • 定义一个fa_ch字典,其key是父级代理商,val是一个集合,记录key的所有子级代理商

而顶级代理商必然没有父级,因此,我们只要遍历agents,用被遍历到的每一个agent去ch_fa中找,如果找不到,则说明对应的agent就是顶级代理商号root。

找到顶级代理商号root后,提供fa_ch,找到root代理商的所有子代理商chs,然后遍历chs,得到每一个ch的赚的钱,从每个ch赚的钱中100抽15,汲取到root代理商赚的钱中。

当然,每个ch赚的钱,也有来自于ch的子级代理商们,同样按照每100抽15的规则汲取。这是一个递归过程。

JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; let n, income, agents, ch_fa, fa_ch; rl.on("line", (line) => { lines.push(line); if (lines.length == 1) { n = parseInt(lines[0]); // income: 记录每个代理商赚的钱, key是代理商号, val是代理商赚的钱 income = {}; // agents: 记录所有的代理商号 agents = []; // ch_fa: key是子级代理商号, val是父级代理商号 ch_fa = {}; // fa_ch: key是父级代理上号, val是key的所有子级代理商号 fa_ch = {}; } if (n && lines.length == n + 1) { lines.shift(); for (let s of lines) { // 子级代理商号,父级代理商号,子级代理商号赚的钱 const [ch_id, fa_id, ch_income] = s.split(" "); income[ch_id] = parseInt(ch_income); agents.push(ch_id); agents.push(fa_id); ch_fa[ch_id] = fa_id; if (!fa_ch[fa_id]) fa_ch[fa_id] = []; if (!fa_ch[ch_id]) fa_ch[ch_id] = []; fa_ch[fa_id].push(ch_id); } console.log(getResult()); lines.length = 0; } }); function getResult() { for (let agent of agents) { // 顶级代理商号(根)没有父级 if (!ch_fa[agent]) { // 设置顶级代理商号 初始金额 为0 income[agent] = 0; // 开始深搜 dfs(agent); return `${agent} ${income[agent]}`; } } } function dfs(fa_id) { // 父级代理商号的所有子级代理商号chs const chs = fa_ch[fa_id]; // 如果存在子级代理商, 则父级代理商从每一个子级代理商赚的钱中:每100元抽15元 if (chs.length > 0) { for (let ch_id of chs) { dfs(ch_id); income[fa_id] += Math.floor(income[ch_id] / 100) * 15; } } }
Java算法源码
import java.util.ArrayList; import java.util.HashMap; import java.util.Scanner; public class Main { // income: 记录每个代理商赚的钱, key是代理商号, val是代理商赚的钱 static HashMap<String, Long> income = new HashMap<>(); // agents: 记录所有的代理商号 static ArrayList<String> agents = new ArrayList<>(); // ch_fa: key是子级代理商号, val是父级代理商号 static HashMap<String, String> ch_fa = new HashMap<>(); // fa_ch: key是父级代理上号, val是key的所有子级代理商号 static HashMap<String, ArrayList<String>> fa_ch = new HashMap<>(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for (int i = 0; i < n; i++) { // 子级代理商号 String ch_id = sc.next(); // 父级代理商号 String fa_id = sc.next(); // 子级代理商号赚的钱 long ch_income = sc.nextLong(); income.put(ch_id, ch_income); agents.add(ch_id); agents.add(fa_id); ch_fa.put(ch_id, fa_id); fa_ch.putIfAbsent(fa_id, new ArrayList<>()); fa_ch.putIfAbsent(ch_id, new ArrayList<>()); fa_ch.get(fa_id).add(ch_id); } System.out.println(getResult()); } public static String getResult() { for (String agent : agents) { // 顶级代理商号(根)没有父级 if (!ch_fa.containsKey(agent)) { // 设置顶级代理商号 初始金额 为0 income.put(agent, 0L); // 开始深搜 dfs(agent); return agent + " " + income.get(agent); } } return ""; } public static void dfs(String fa_id) { // 父级代理商号的所有子级代理商号chs ArrayList<String> chs = fa_ch.get(fa_id); // 如果存在子级代理商, 则父级代理商从每一个子级代理商赚的钱中:每100元抽15元 if (chs.size() > 0) { for (String ch_id : chs) { dfs(ch_id); income.put(fa_id, income.get(fa_id) + income.get(ch_id) / 100 * 15); } } } }
Python算法源码
# 输入获取 n = int(input()) # income: 记录每个代理商赚的钱, key是代理商号, val是代理商赚的钱 income = {} # agents: 记录所有的代理商号 agents = [] # ch_fa: key是子级代理商号, val是父级代理商号 ch_fa = {} # fa_ch: key是父级代理上号, val是key的所有子级代理商号 fa_ch = {} for _ in range(n): # 子级代理商号,父级代理商号,子级代理商号赚的钱 ch_id, fa_id, ch_income = input().split() income[ch_id] = int(ch_income) agents.append(ch_id) agents.append(fa_id) ch_fa[ch_id] = fa_id fa_ch.setdefault(fa_id, []) fa_ch.setdefault(ch_id, []) fa_ch[fa_id].append(ch_id) def dfs(fa): # 父级代理商号的所有子级代理商号chs chs = fa_ch[fa] # 如果存在子级代理商, 则父级代理商从每一个子级代理商赚的钱中:每100元抽15元 if len(chs) > 0: for ch in chs: dfs(ch) income[fa] += income[ch] // 100 * 15 # 算法入口 def getResult(): for agent in agents: # 顶级代理商号(根)没有父级 if ch_fa.get(agent) is None: # 设置顶级代理商号 初始金额 为0 income[agent] = 0 # 开始深搜 dfs(agent) return f"{agent} {income[agent]}" # 算法调用 print(getResult())
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 11:42:27

day132—链表—K个一组翻转链表(LeetCode-25)

题目描述给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部…

作者头像 李华
网站建设 2026/6/5 4:02:22

【毕业设计】基于Java的学生身体素质测评管理系统基于SpringBoot的学生身体素质测评管理系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/5 0:45:20

【信号处理】通过 “最近邻匹配” 和 “球面线性插值(SLERP)” 两种方式将 GNSS 位姿(位置 + 四元数)插值到激光雷达时间戳附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华
网站建设 2026/6/4 9:53:33

计算机毕设 java 基于协同过滤算法的就业推荐系统的设计与实现 基于协同过滤算法的智能就业推荐平台 求职与企业招聘匹配系统

计算机毕设 java 基于协同过滤算法的就业推荐系统的设计与实现&#xff08;配套有源码、程序、MySQL 数据库、论文&#xff09;&#xff0c;本套源码可先查看功能演示视频&#xff0c;文末有联xi 可分享c系统核心功能涵盖注册登录、个人中心、多角色管理&#xff08;管理员、用…

作者头像 李华