news 2026/4/3 2:04:04

(新卷,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/3/27 6:01:23

配电网多目标pareto重构+智能算法Matlab代码

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

作者头像 李华
网站建设 2026/3/27 9:47:22

初认Langchain,详细介绍Langchain是什么

前言当大语言模型&#xff08;LLM&#xff09;的浪潮席卷而来&#xff0c;无数开发者和创业者都怀揣着同一个梦想&#xff1a;构建一个能真正理解、推理并与现实世界交互的智能应用。然而&#xff0c;从一个简单的 curl 请求到一个健壮、可靠、可维护的产品&#xff0c;中间横亘…

作者头像 李华
网站建设 2026/4/1 3:24:34

Jina Embeddings v4: 多模态多语言检索的通用向量

作者&#xff1a;Elastic JINA.ai Jina Embeddings v4 是一个 38 亿参数的通用向量模型&#xff0c;用于多模态多语言检索&#xff0c;支持单向量和多向量输出。 今天&#xff08;2025年6月25日&#xff09;我们发布了 jina-embeddings-v4&#xff0c;这是我们新的 38 亿参数通…

作者头像 李华
网站建设 2026/3/31 6:42:57

「数据获取」全国民用运输机场吞吐量排名(2006-2024)

01、数据简介数据概况以2024年中国民用运输机场吞吐量排名为例&#xff0c;指标为&#xff1a;机场名、旅客吞吐量&#xff08;人&#xff09;&#xff08;名次、本期完成、上年同期、比上年同期增减%&#xff09;、货邮吞吐量&#xff08;吨&#xff09;&#xff08;名次、本期…

作者头像 李华
网站建设 2026/3/27 15:33:23

PE之代码解析异常表

PE之代码解析异常表 1)异常表 异常表(ExceptionTable,注意你拼写的Exection是笔误,正确为Exception)是PE(PortableExecutable)文件格式中用于存储结构化异常处理(SEH)和基于帧的异常处理(EH)相关信息的数据结构,是Windows系统处理程序运行时异常(如内存访问错误,…

作者头像 李华