【2024年华为OD机试】 (B卷,100分)- 金字塔,BOSS的收入(Java JS PythonC/C++)
一、问题描述
微商模式收入计算
题目描述
微商模式中,下级每赚 100 元就要上交 15 元。给定每个级别的收入,求出金字塔尖上的人的收入。
输入描述
- 第一行输入
N
,表示有N
个代理商上下级关系。 - 接下来输入
N
行,每行三个数:- 代理商代号
- 上级代理商代号
- 代理商赚的钱
输出描述
输出一行,两个以空格分隔的整数:
- 金字塔顶代理商代号
- 最终的钱数
用例
用例 1
输入:
3
1 0 223
2 0 323
3 2 1203
输出:
0 105
说明:
- 代理商 2 的最终收入为
323 + 1203 / 100 * 15 = 323 + 180 = 503
。 - 代理商 0 的最终收入为
(223 + 323 + 180) / 100 * 15 = 105
。
用例 2
输入:
4
1 0 100
2 0 200
3 0 300
4 0 200
输出:
0 120
说明:
- 所有下级代理商赚的钱总和为
100 + 200 + 300 + 200 = 800
。 - 顶级代理商 0 的收入为
800 / 100 * 15 = 120
。
题目解析
问题分析
-
树形结构:
- 代理商的上下级关系构成一棵树,顶级代理商是树的根节点。
- 每个下级代理商赚的钱需要按照规则上交给上级代理商。
-
规则:
- 下级每赚 100 元,上级抽取 15 元。
- 顶级代理商的收入来自所有下级代理商的上交金额。
-
难点:
- 如何确定顶级代理商的代号。
- 如何递归计算每个代理商的最终收入。
解题思路
-
数据结构设计:
- 使用一个字典
income
,键为代理商代号,值为该代理商赚的钱。 - 使用一个集合
agents
记录所有出现过的代理商代号。 - 使用一个字典
ch_fa
,键为子级代理商代号,值为父级代理商代号。 - 使用一个字典
fa_ch
,键为父级代理商代号,值为一个集合,记录该父级的所有子级代理商。
- 使用一个字典
-
确定顶级代理商:
- 顶级代理商没有父级,因此遍历
agents
,找到在ch_fa
中不存在的代理商代号,即为顶级代理商。
- 顶级代理商没有父级,因此遍历
-
递归计算收入:
- 从顶级代理商开始,递归计算每个代理商的最终收入。
- 对于每个代理商,遍历其所有子级代理商,从子级代理商赚的钱中每 100 元抽取 15 元,累加到当前代理商的收入中。
示例解析
示例 1
输入:
3
1 0 223
2 0 323
3 2 1203
解析:
-
构建数据结构:
income = {1: 223, 2: 323, 3: 1203}
agents = {0, 1, 2, 3}
ch_fa = {1: 0, 2: 0, 3: 2}
fa_ch = {0: {1, 2}, 2: {3}}
-
确定顶级代理商:
- 代理商 0 没有父级,因此顶级代理商为 0。
-
计算收入:
- 代理商 3 的收入为
1203
,上交给代理商 2 的金额为1203 / 100 * 15 = 180
。 - 代理商 2 的最终收入为
323 + 180 = 503
。 - 代理商 2 上交给代理商 0 的金额为
503 / 100 * 15 = 75
。 - 代理商 1 上交给代理商 0 的金额为
223 / 100 * 15 = 33
。 - 代理商 0 的最终收入为
75 + 33 = 105
。
- 代理商 3 的收入为
输出:
0 105
示例 2
输入:
4
1 0 100
2 0 200
3 0 300
4 0 200
解析:
-
构建数据结构:
income = {1: 100, 2: 200, 3: 300, 4: 200}
agents = {0, 1, 2, 3, 4}
ch_fa = {1: 0, 2: 0, 3: 0, 4: 0}
fa_ch = {0: {1, 2, 3, 4}}
-
确定顶级代理商:
- 代理商 0 没有父级,因此顶级代理商为 0。
-
计算收入:
- 所有下级代理商赚的钱总和为
100 + 200 + 300 + 200 = 800
。 - 顶级代理商 0 的收入为
800 / 100 * 15 = 120
。
- 所有下级代理商赚的钱总和为
输出:
0 120
总结
- 本题的核心是树形结构的遍历和递归计算。
- 通过构建合适的数据结构,可以高效地确定顶级代理商并计算其最终收入。
- 递归计算时,注意每 100 元抽取 15 元的规则,确保计算结果准确。
二、JavaScript算法源码
以下是对代码的详细注释和讲解,帮助理解每一部分的功能和逻辑:
1. 代码整体结构
这段代码实现了一个代理商收入计算系统。通过读取输入数据,构建代理商之间的关系树,并计算每个代理商的收入。最终输出顶级代理商的编号和总收入。
2. 模块引入和初始化
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});
- 引入
readline
模块,用于从控制台读取输入。 - 创建
readline.Interface
实例rl
,用于处理输入和输出。
3. 全局变量定义
const lines = [];
let n, income, agents, ch_fa, fa_ch;
lines
: 用于存储从控制台读取的每一行输入。n
: 表示代理商关系的数量。income
: 一个对象,用于存储每个代理商的收入。agents
: 一个数组,用于存储所有代理商号。ch_fa
: 一个对象,用于存储子级代理商号到父级代理商号的映射。fa_ch
: 一个对象,用于存储父级代理商号到其所有子级代理商号的映射。
4. 输入处理
rl.on("line", (line) => {lines.push(line);if (lines.length == 1) {n = parseInt(lines[0]);income = {};agents = [];ch_fa = {};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;}
});
rl.on("line", (line) => {...})
: 监听控制台输入,每输入一行数据,将其存入lines
数组。if (lines.length == 1)
: 当读取到第一行时,初始化变量:n
为代理商关系的数量。income
、agents
、ch_fa
、fa_ch
为空对象或空数组。
if (n && lines.length == n + 1)
: 当读取完所有输入后:- 移除第一行(
lines.shift()
),因为第一行是n
,不是代理商关系数据。 - 遍历剩余行,解析每行的数据:
ch_id
: 子级代理商号。fa_id
: 父级代理商号。ch_income
: 子级代理商的收入。
- 更新
income
、agents
、ch_fa
、fa_ch
数据结构。 - 调用
getResult()
计算结果,并输出。 - 清空
lines
数组,以便处理下一组输入。
- 移除第一行(
5. 结果计算
function getResult() {for (let agent of agents) {// 顶级代理商号(根)没有父级if (!ch_fa[agent]) {// 设置顶级代理商号 初始金额 为0income[agent] = 0;// 开始深搜dfs(agent);return `${agent} ${income[agent]}`;}}
}
getResult()
: 找到顶级代理商(没有父级的代理商),并计算其收入。- 遍历
agents
数组,找到没有父级的代理商(即ch_fa[agent]
为undefined
)。 - 设置顶级代理商的初始收入为
0
。 - 调用
dfs(agent)
递归计算其收入。 - 返回顶级代理商的编号和总收入。
- 遍历
6. 深度优先搜索(DFS)
function dfs(fa_id) {// 父级代理商号的所有子级代理商号chsconst 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;}}
}
dfs(fa_id)
: 递归计算父级代理商的收入。- 获取父级代理商的所有子级代理商
chs
。 - 如果存在子级代理商:
- 对每个子级代理商递归调用
dfs
,确保子级代理商的收入已计算。 - 父级代理商从每个子级代理商的收入中抽取15%的利润(每100元抽15元),并累加到自己的收入中。
- 对每个子级代理商递归调用
- 获取父级代理商的所有子级代理商
7. 示例运行
假设输入如下:
3
1 0 1000
2 0 2000
3 1 500
- 解析输入:
n = 3
,表示有3条代理商关系。- 代理商关系:
- 代理商1的父级是代理商0,收入1000。
- 代理商2的父级是代理商0,收入2000。
- 代理商3的父级是代理商1,收入500。
- 构建数据结构:
income = { "1": 1000, "2": 2000, "3": 500 }
agents = ["1", "0", "2", "0", "3", "1"]
ch_fa = { "1": "0", "2": "0", "3": "1" }
fa_ch = { "0": ["1", "2"], "1": ["3"], "2": [], "3": [] }
- 计算结果:
- 顶级代理商是
0
。 - 递归计算:
- 代理商3的收入是500,代理商1从中抽取75元(500 / 100 * 15)。
- 代理商1的总收入是1000 + 75 = 1075元。
- 代理商2的收入是2000,代理商0从中抽取300元(2000 / 100 * 15)。
- 代理商1的收入是1075,代理商0从中抽取161元(1075 / 100 * 15,向下取整)。
- 代理商0的总收入是0 + 300 + 161 = 461元。
- 顶级代理商是
- 输出:
0 461
8. 代码优化建议
- 去重代理商号:
agents
数组中可能包含重复的代理商号,可以使用Set
去重。
agents = [...new Set(agents)];
- 输入验证:
- 确保输入的格式正确,例如每行必须有3个值。
- 性能优化:
- 如果代理商数量非常大,可以使用非递归的DFS实现,以避免栈溢出。
总结
这段代码通过构建代理商关系树,并使用DFS递归计算每个代理商的收入,最终输出顶级代理商的收入。代码结构清晰,逻辑正确,适合处理小到中等规模的输入数据。通过详细注释和讲解,可以更好地理解代码的每一部分功能和实现原理。
三、Java算法源码
以下是 Java 版本 的代码详细注释和讲解,帮助理解每一部分的功能和逻辑:
1. 代码整体结构
这段代码实现了一个代理商收入计算系统。通过读取输入数据,构建代理商之间的关系树,并计算每个代理商的收入。最终输出顶级代理商的编号和总收入。
2. 全局变量定义
// 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<>();
income
: 使用HashMap
存储每个代理商的收入,key
是代理商号,value
是收入。agents
: 使用ArrayList
存储所有代理商号。ch_fa
: 使用HashMap
存储子级代理商号到父级代理商号的映射。fa_ch
: 使用HashMap
存储父级代理商号到其所有子级代理商号的映射。
3. 主函数
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());
}
Scanner sc = new Scanner(System.in)
: 创建Scanner
对象,用于读取控制台输入。int n = sc.nextInt()
: 读取代理商关系的数量。for (int i = 0; i < n; i++)
: 循环读取每一条代理商关系:ch_id
: 子级代理商号。fa_id
: 父级代理商号。ch_income
: 子级代理商的收入。
income.put(ch_id, ch_income)
: 将子级代理商的收入存入income
。agents.add(ch_id)
和agents.add(fa_id)
: 将子级和父级代理商号存入agents
。ch_fa.put(ch_id, fa_id)
: 建立子级到父级的映射。fa_ch.putIfAbsent(fa_id, new ArrayList<>())
: 如果父级代理商号不存在,则初始化一个空列表。fa_ch.get(fa_id).add(ch_id)
: 将子级代理商号添加到父级代理商号的子级列表中。System.out.println(getResult())
: 调用getResult()
计算结果并输出。
4. 结果计算
public static String getResult() {for (String agent : agents) {// 顶级代理商号(根)没有父级if (!ch_fa.containsKey(agent)) {// 设置顶级代理商号 初始金额 为0income.put(agent, 0L);// 开始深搜dfs(agent);return agent + " " + income.get(agent);}}return "";
}
getResult()
: 找到顶级代理商(没有父级的代理商),并计算其收入。- 遍历
agents
列表,找到没有父级的代理商(即ch_fa
中不包含该代理商号)。 - 设置顶级代理商的初始收入为
0
。 - 调用
dfs(agent)
递归计算其收入。 - 返回顶级代理商的编号和总收入。
- 遍历
5. 深度优先搜索(DFS)
public static void dfs(String fa_id) {// 父级代理商号的所有子级代理商号chsArrayList<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);}}
}
dfs(fa_id)
: 递归计算父级代理商的收入。- 获取父级代理商的所有子级代理商
chs
。 - 如果存在子级代理商:
- 对每个子级代理商递归调用
dfs
,确保子级代理商的收入已计算。 - 父级代理商从每个子级代理商的收入中抽取15%的利润(每100元抽15元),并累加到自己的收入中。
- 对每个子级代理商递归调用
- 获取父级代理商的所有子级代理商
6. 示例运行
假设输入如下:
3
1 0 1000
2 0 2000
3 1 500
- 解析输入:
n = 3
,表示有3条代理商关系。- 代理商关系:
- 代理商1的父级是代理商0,收入1000。
- 代理商2的父级是代理商0,收入2000。
- 代理商3的父级是代理商1,收入500。
- 构建数据结构:
income = { "1": 1000, "2": 2000, "3": 500 }
agents = ["1", "0", "2", "0", "3", "1"]
ch_fa = { "1": "0", "2": "0", "3": "1" }
fa_ch = { "0": ["1", "2"], "1": ["3"], "2": [], "3": [] }
- 计算结果:
- 顶级代理商是
0
。 - 递归计算:
- 代理商3的收入是500,代理商1从中抽取75元(500 / 100 * 15)。
- 代理商1的总收入是1000 + 75 = 1075元。
- 代理商2的收入是2000,代理商0从中抽取300元(2000 / 100 * 15)。
- 代理商1的收入是1075,代理商0从中抽取161元(1075 / 100 * 15,向下取整)。
- 代理商0的总收入是0 + 300 + 161 = 461元。
- 顶级代理商是
- 输出:
0 461
7. 代码优化建议
- 去重代理商号:
agents
列表中可能包含重复的代理商号,可以使用Set
去重。
agents = new ArrayList<>(new HashSet<>(agents));
- 输入验证:
- 确保输入的格式正确,例如每行必须有3个值。
- 性能优化:
- 如果代理商数量非常大,可以使用非递归的DFS实现,以避免栈溢出。
总结
这段代码通过构建代理商关系树,并使用DFS递归计算每个代理商的收入,最终输出顶级代理商的收入。代码结构清晰,逻辑正确,适合处理小到中等规模的输入数据。通过详细注释和讲解,可以更好地理解代码的每一部分功能和实现原理。
四、Python算法源码
以下是 Python 版本 的代码详细注释和讲解,帮助理解每一部分的功能和逻辑:
1. 代码整体结构
这段代码实现了一个代理商收入计算系统。通过读取输入数据,构建代理商之间的关系树,并计算每个代理商的收入。最终输出顶级代理商的编号和总收入。
2. 输入处理
# 输入获取
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_idfa_ch.setdefault(fa_id, [])fa_ch.setdefault(ch_id, [])fa_ch[fa_id].append(ch_id)
n = int(input())
: 读取代理商关系的数量。income
: 使用字典存储每个代理商的收入,key
是代理商号,value
是收入。agents
: 使用列表存储所有代理商号。ch_fa
: 使用字典存储子级代理商号到父级代理商号的映射。fa_ch
: 使用字典存储父级代理商号到其所有子级代理商号的映射。for _ in range(n)
: 循环读取每一条代理商关系:ch_id
: 子级代理商号。fa_id
: 父级代理商号。ch_income
: 子级代理商的收入。
income[ch_id] = int(ch_income)
: 将子级代理商的收入存入income
。agents.append(ch_id)
和agents.append(fa_id)
: 将子级和父级代理商号存入agents
。ch_fa[ch_id] = fa_id
: 建立子级到父级的映射。fa_ch.setdefault(fa_id, [])
: 如果父级代理商号不存在,则初始化一个空列表。fa_ch[fa_id].append(ch_id)
: 将子级代理商号添加到父级代理商号的子级列表中。
3. 深度优先搜索(DFS)
def dfs(fa):# 父级代理商号的所有子级代理商号chschs = fa_ch[fa]# 如果存在子级代理商, 则父级代理商从每一个子级代理商赚的钱中:每100元抽15元if len(chs) > 0:for ch in chs:dfs(ch)income[fa] += income[ch] // 100 * 15
dfs(fa)
: 递归计算父级代理商的收入。- 获取父级代理商的所有子级代理商
chs
。 - 如果存在子级代理商:
- 对每个子级代理商递归调用
dfs
,确保子级代理商的收入已计算。 - 父级代理商从每个子级代理商的收入中抽取15%的利润(每100元抽15元),并累加到自己的收入中。
- 对每个子级代理商递归调用
- 获取父级代理商的所有子级代理商
4. 结果计算
# 算法入口
def getResult():for agent in agents:# 顶级代理商号(根)没有父级if ch_fa.get(agent) is None:# 设置顶级代理商号 初始金额 为0income[agent] = 0# 开始深搜dfs(agent)return f"{agent} {income[agent]}"
getResult()
: 找到顶级代理商(没有父级的代理商),并计算其收入。- 遍历
agents
列表,找到没有父级的代理商(即ch_fa
中不包含该代理商号)。 - 设置顶级代理商的初始收入为
0
。 - 调用
dfs(agent)
递归计算其收入。 - 返回顶级代理商的编号和总收入。
- 遍历
5. 算法调用
# 算法调用
print(getResult())
- 调用
getResult()
计算结果并输出。
6. 示例运行
假设输入如下:
3
1 0 1000
2 0 2000
3 1 500
- 解析输入:
n = 3
,表示有3条代理商关系。- 代理商关系:
- 代理商1的父级是代理商0,收入1000。
- 代理商2的父级是代理商0,收入2000。
- 代理商3的父级是代理商1,收入500。
- 构建数据结构:
income = { "1": 1000, "2": 2000, "3": 500 }
agents = ["1", "0", "2", "0", "3", "1"]
ch_fa = { "1": "0", "2": "0", "3": "1" }
fa_ch = { "0": ["1", "2"], "1": ["3"], "2": [], "3": [] }
- 计算结果:
- 顶级代理商是
0
。 - 递归计算:
- 代理商3的收入是500,代理商1从中抽取75元(500 // 100 * 15)。
- 代理商1的总收入是1000 + 75 = 1075元。
- 代理商2的收入是2000,代理商0从中抽取300元(2000 // 100 * 15)。
- 代理商1的收入是1075,代理商0从中抽取161元(1075 // 100 * 15,向下取整)。
- 代理商0的总收入是0 + 300 + 161 = 461元。
- 顶级代理商是
- 输出:
0 461
7. 代码优化建议
- 去重代理商号:
agents
列表中可能包含重复的代理商号,可以使用set
去重。
agents = list(set(agents))
- 输入验证:
- 确保输入的格式正确,例如每行必须有3个值。
- 性能优化:
- 如果代理商数量非常大,可以使用非递归的DFS实现,以避免栈溢出。
总结
这段代码通过构建代理商关系树,并使用DFS递归计算每个代理商的收入,最终输出顶级代理商的收入。代码结构清晰,逻辑正确,适合处理小到中等规模的输入数据。通过详细注释和讲解,可以更好地理解代码的每一部分功能和实现原理。
五、C/C++算法源码:
以下是 C++ 和 C语言 版本的代码实现,附带详细的中文注释和讲解。
C++ 版本
代码实现
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
using namespace std;// income: 记录每个代理商赚的钱, key是代理商号, val是代理商赚的钱
unordered_map<string, long long> income;
// agents: 记录所有的代理商号
vector<string> agents;
// ch_fa: key是子级代理商号, val是父级代理商号
unordered_map<string, string> ch_fa;
// fa_ch: key是父级代理上号, val是key的所有子级代理商号
unordered_map<string, vector<string>> fa_ch;// 深度优先搜索(DFS)
void dfs(const string& fa) {// 父级代理商号的所有子级代理商号chsvector<string> chs = fa_ch[fa];// 如果存在子级代理商, 则父级代理商从每一个子级代理商赚的钱中:每100元抽15元if (!chs.empty()) {for (const string& ch : chs) {dfs(ch);income[fa] += income[ch] / 100 * 15;}}
}// 算法入口
string getResult() {for (const string& agent : agents) {// 顶级代理商号(根)没有父级if (ch_fa.find(agent) == ch_fa.end()) {// 设置顶级代理商号 初始金额 为0income[agent] = 0;// 开始深搜dfs(agent);return agent + " " + to_string(income[agent]);}}return "";
}int main() {int n;cin >> n;for (int i = 0; i < n; i++) {// 子级代理商号,父级代理商号,子级代理商号赚的钱string ch_id, fa_id;long long ch_income;cin >> ch_id >> fa_id >> ch_income;income[ch_id] = ch_income;agents.push_back(ch_id);agents.push_back(fa_id);ch_fa[ch_id] = fa_id;if (fa_ch.find(fa_id) == fa_ch.end()) fa_ch[fa_id] = vector<string>();if (fa_ch.find(ch_id) == fa_ch.end()) fa_ch[ch_id] = vector<string>();fa_ch[fa_id].push_back(ch_id);}cout << getResult() << endl;return 0;
}
代码讲解
-
数据结构:
income
: 使用unordered_map
存储每个代理商的收入,key
是代理商号,value
是收入。agents
: 使用vector
存储所有代理商号。ch_fa
: 使用unordered_map
存储子级代理商号到父级代理商号的映射。fa_ch
: 使用unordered_map
存储父级代理商号到其所有子级代理商号的映射。
-
输入处理:
- 读取代理商关系的数量
n
。 - 循环读取每一条代理商关系,更新
income
、agents
、ch_fa
和fa_ch
。
- 读取代理商关系的数量
-
深度优先搜索(DFS):
- 递归计算父级代理商的收入。
- 父级代理商从每个子级代理商的收入中抽取15%的利润(每100元抽15元),并累加到自己的收入中。
-
结果计算:
- 找到顶级代理商(没有父级的代理商),并调用
dfs
计算其收入。 - 返回顶级代理商的编号和总收入。
- 找到顶级代理商(没有父级的代理商),并调用
-
输出结果:
- 调用
getResult()
并输出结果。
- 调用
C语言版本
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_AGENTS 1000
#define ID_LENGTH 10// income: 记录每个代理商赚的钱, key是代理商号, val是代理商赚的钱
long long income[MAX_AGENTS];
// agents: 记录所有的代理商号
char agents[MAX_AGENTS][ID_LENGTH];
int agent_count = 0;
// ch_fa: key是子级代理商号, val是父级代理商号
char ch_fa[MAX_AGENTS][ID_LENGTH];
// fa_ch: key是父级代理上号, val是key的所有子级代理商号
char fa_ch[MAX_AGENTS][ID_LENGTH][MAX_AGENTS];
int fa_ch_count[MAX_AGENTS] = {0};// 查找代理商号的索引
int find_agent_index(const char* id) {for (int i = 0; i < agent_count; i++) {if (strcmp(agents[i], id) == 0) return i;}return -1;
}// 深度优先搜索(DFS)
void dfs(int fa_index) {// 父级代理商号的所有子级代理商号chsfor (int i = 0; i < fa_ch_count[fa_index]; i++) {int ch_index = find_agent_index(fa_ch[fa_index][i]);dfs(ch_index);income[fa_index] += income[ch_index] / 100 * 15;}
}// 算法入口
void getResult() {for (int i = 0; i < agent_count; i++) {// 顶级代理商号(根)没有父级if (strlen(ch_fa[i]) == 0) {// 设置顶级代理商号 初始金额 为0income[i] = 0;// 开始深搜dfs(i);printf("%s %lld\n", agents[i], income[i]);return;}}
}int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) {// 子级代理商号,父级代理商号,子级代理商号赚的钱char ch_id[ID_LENGTH], fa_id[ID_LENGTH];long long ch_income;scanf("%s %s %lld", ch_id, fa_id, &ch_income);int ch_index = find_agent_index(ch_id);if (ch_index == -1) {strcpy(agents[agent_count], ch_id);ch_index = agent_count++;}income[ch_index] = ch_income;int fa_index = find_agent_index(fa_id);if (fa_index == -1) {strcpy(agents[agent_count], fa_id);fa_index = agent_count++;}strcpy(ch_fa[ch_index], fa_id);strcpy(fa_ch[fa_index][fa_ch_count[fa_index]++], ch_id);}getResult();return 0;
}
代码讲解
-
数据结构:
income
: 使用数组存储每个代理商的收入,索引对应代理商号。agents
: 使用二维数组存储所有代理商号。ch_fa
: 使用二维数组存储子级代理商号到父级代理商号的映射。fa_ch
: 使用三维数组存储父级代理商号到其所有子级代理商号的映射。
-
输入处理:
- 读取代理商关系的数量
n
。 - 循环读取每一条代理商关系,更新
income
、agents
、ch_fa
和fa_ch
。
- 读取代理商关系的数量
-
深度优先搜索(DFS):
- 递归计算父级代理商的收入。
- 父级代理商从每个子级代理商的收入中抽取15%的利润(每100元抽15元),并累加到自己的收入中。
-
结果计算:
- 找到顶级代理商(没有父级的代理商),并调用
dfs
计算其收入。 - 输出顶级代理商的编号和总收入。
- 找到顶级代理商(没有父级的代理商),并调用
总结
- C++ 版本:使用 STL 容器(如
unordered_map
和vector
)简化了数据管理,代码更简洁。 - C语言版本:使用数组和手动管理数据,适合对内存和性能要求较高的场景。
- 两种版本都实现了相同的功能,适合不同的编程需求和场景。
六、尾言
什么是华为OD?
华为OD(Outsourcing Developer,外包开发工程师)是华为针对软件开发工程师岗位的一种招聘形式,主要包括笔试、技术面试以及综合面试等环节。尤其在笔试部分,算法题的机试至关重要。
为什么刷题很重要?
-
机试是进入技术面的第一关:
华为OD机试(常被称为机考)主要考察算法和编程能力。只有通过机试,才能进入后续的技术面试环节。 -
技术面试需要手撕代码:
技术一面和二面通常会涉及现场编写代码或算法题。面试官会注重考察候选人的思路清晰度、代码规范性以及解决问题的能力。因此提前刷题、多练习是通过面试的重要保障。 -
入职后的可信考试:
入职华为后,还需要通过“可信考试”。可信考试分为三个等级:- 入门级:主要考察基础算法与编程能力。
- 工作级:更贴近实际业务需求,可能涉及复杂的算法或与工作内容相关的场景题目。
- 专业级:最高等级,考察深层次的算法以及优化能力,与薪资直接挂钩。
刷题策略与说明:
2024年8月14日之后,华为OD机试的题库转为 E卷,由往年题库(D卷、A卷、B卷、C卷)和全新题目组成。刷题时可以参考以下策略:
-
关注历年真题:
- 题库中的旧题占比较大,建议优先刷历年的A卷、B卷、C卷、D卷题目。
- 对于每道题目,建议深度理解其解题思路、代码实现,以及相关算法的适用场景。
-
适应新题目:
- E卷中包含全新题目,需要掌握全面的算法知识和一定的灵活应对能力。
- 建议关注新的刷题平台或交流群,获取最新题目的解析和动态。
-
掌握常见算法:
华为OD考试通常涉及以下算法和数据结构:- 排序算法(快速排序、归并排序等)
- 动态规划(背包问题、最长公共子序列等)
- 贪心算法
- 栈、队列、链表的操作
- 图论(最短路径、最小生成树等)
- 滑动窗口、双指针算法
-
保持编程规范:
- 注重代码的可读性和注释的清晰度。
- 熟练使用常见编程语言,如C++、Java、Python等。
如何获取资源?
-
官方参考:
- 华为招聘官网或相关的招聘平台会有一些参考信息。
- 华为OD的相关公众号可能也会发布相关的刷题资料或学习资源。
-
加入刷题社区:
- 找到可信的刷题交流群,与其他备考的小伙伴交流经验。
- 关注知名的刷题网站,如LeetCode、牛客网等,这些平台上有许多华为OD的历年真题和解析。
-
寻找系统性的教程:
- 学习一本经典的算法书籍,例如《算法导论》《剑指Offer》《编程之美》等。
- 完成系统的学习课程,例如数据结构与算法的在线课程。
积极心态与持续努力:
刷题的过程可能会比较枯燥,但它能够显著提升编程能力和算法思维。无论是为了通过华为OD的招聘考试,还是为了未来的职业发展,这些积累都会成为重要的财富。
考试注意细节
-
本地编写代码
- 在本地 IDE(如 VS Code、PyCharm 等)上编写、保存和调试代码,确保逻辑正确后再复制粘贴到考试页面。这样可以减少语法错误,提高代码准确性。
-
调整心态,保持冷静
- 遇到提示不足或实现不确定的问题时,不必慌张,可以采用更简单或更有把握的方法替代,确保思路清晰。
-
输入输出完整性
- 注意训练和考试时都需要编写完整的输入输出代码,尤其是和题目示例保持一致。完成代码后务必及时调试,确保功能符合要求。
-
快捷键使用
- 删除行可用
Ctrl+D
,复制、粘贴和撤销分别为Ctrl+C
,Ctrl+V
,Ctrl+Z
,这些可以正常使用。 - 避免使用
Ctrl+S
,以免触发浏览器的保存功能。
- 删除行可用
-
浏览器要求
- 使用最新版的 Google Chrome 浏览器完成考试,确保摄像头开启并正常工作。考试期间不要切换到其他网站,以免影响考试成绩。
-
交卷相关
- 答题前,务必仔细查看题目示例,避免遗漏要求。
- 每完成一道题后,点击【保存并调试】按钮,多次保存和调试是允许的,系统会记录得分最高的一次结果。完成所有题目后,点击【提交本题型】按钮。
- 确保在考试结束前提交试卷,避免因未保存或调试失误而丢分。
-
时间和分数安排
- 总时间:150 分钟;总分:400 分。
- 试卷结构:2 道一星难度题(每题 100 分),1 道二星难度题(200 分)。及格分为 150 分。合理分配时间,优先完成自己擅长的题目。
-
考试环境准备
- 考试前请备好草稿纸和笔。考试中尽量避免离开座位,确保监控画面正常。
- 如需上厕所,请提前规划好时间以减少中途离开监控的可能性。
-
技术问题处理
- 如果考试中遇到断电、断网、死机等技术问题,可以关闭浏览器并重新打开试卷链接继续作答。
- 出现其他问题,请第一时间联系 HR 或监考人员进行反馈。
祝你考试顺利,取得理想成绩!
相关文章:
【2024年华为OD机试】 (B卷,100分)- 金字塔,BOSS的收入(Java JS PythonC/C++)
一、问题描述 微商模式收入计算 题目描述 微商模式中,下级每赚 100 元就要上交 15 元。给定每个级别的收入,求出金字塔尖上的人的收入。 输入描述 第一行输入 N,表示有 N 个代理商上下级关系。接下来输入 N 行,每行三个数&am…...
缓存、数据库双写一致性解决方案
双写一致性问题的核心是确保数据库和缓存之间的数据同步,以避免缓存与数据库数据不同步的问题,尤其是在高并发和异步环境下。本文将探讨双写一致性面临的主要问题和解决方案,重点关注最终一致性。 本文讨论的是最终一致性问题 双写一致性面…...
开放银行数据保护与合规实践案例
总体原则 开放银行的数据处理基本原则指的是数据处理者在数据生命周期的各阶段进行各种数 据处理时均应遵循的根本准则,是指导监管机构制定规范、进行管理以及开放银行进 行具体数据处理行为的纲领。根据《民法典》《个人信息保护法》《数据安全法》 《网络安全法…...
51c自动驾驶~合集47
我自己的原文哦~ https://blog.51cto.com/whaosoft/13083194 #DreamDrive 性能爆拉30%!英伟达:时空一致下的生成重建大一统新方案~ 从自车的驾驶轨迹中生成真实的视觉图像是实现自动驾驶模型可扩展训练的关键一步。基于重建的方法从log中生成3D场景…...
2024年AI与大数据技术趋势洞察:跨领域创新与社会变革
目录 引言 技术洞察 1. 大模型技术的创新与开源推动 2. AI Agent 智能体平台技术 3. 多模态技术的兴起:跨领域应用的新风口 4. 强化学习与推荐系统:智能化决策的底层驱动 5. 开源工具与平台的快速发展:赋能技术创新 6. 技术安全与伦理:AI技术的双刃剑 7. 跨领域技…...
【protobuf】二、proto3语法详解①
文章目录 前言Ⅰ. 字段规则Ⅱ. 消息类型的定义和使用1、定义2、使用1️⃣消息类型可作为字段类型使⽤2️⃣可导入其他 .proto 文件的消息并使用 -- import 3、创建通讯录 2.0 版本的 .proto 文件4、通讯录 2.0 版本的读写实现 -- 第一种验证方式5、decode选项 -- 第二种验证方式…...
React 中hooks之useLayoutEffect 用法总结以及与useEffect的区别
React useLayoutEffect 1. useLayoutEffect 基本概念 useLayoutEffect 是 React 的一个 Hook,它的函数签名与 useEffect 完全相同,但它会在所有的 DOM 变更之后同步调用 effect。它可以用来读取 DOM 布局并同步触发重渲染。 2. useLayoutEffect vs us…...
实战经验:使用 Python 的 PyPDF 进行 PDF 操作
文章目录 1. 为什么选择 PyPDF?2. 安装 PyPDF3. PDF 文件的合并与拆分3.1 合并 PDF 文件3.2 拆分 PDF 文件 4. 提取 PDF 文本5. 修改 PDF 元信息6. PDF 加密与解密6.1 加密 PDF6.2 解密 PDF 7. 页面旋转与裁剪7.1 旋转页面7.2 裁剪页面 8. 实战经验总结 PDF 是一种非…...
数据结构与算法之排序: LeetCode 15. 三数之和 (Ts版)
三数之和 https://leetcode.cn/problems/3sum/description/ 描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0请你返回所有和为 0 且不重复的三元…...
51c嵌入式~单片机~合集6
我自己的原文哦~ https://blog.51cto.com/whaosoft/13127816 一、STM32单片机的知识点总结 本文将以STM32F10x为例,对标准库开发进行概览。主要分为三块内容: STM32系统结构寄存器通过点灯案例,详解如何基于标准库构建STM32工程 STM3…...
SQL Server Management Studio 表内数据查询与删除指令
查询指令 //select * from 表名称 where 列名称 数据名称 select * from Card_Info where num CC3D4D删除指令,删除数据库有风险,操作不可逆,建议删除前备份,以免删错。 //Delete * from 表名称 where 列名称 数据名称 Delete f…...
Timesheet.js - 轻松打造炫酷时间表
Timesheet.js - 轻松打造炫酷时间表 前言 在现代网页设计中,时间表是一个常见的元素,用于展示项目进度、历史事件、个人经历等信息。 然而,创建一个既美观又功能强大的时间表并非易事。 幸运的是,Timesheet.js 这款神奇的 Java…...
产品经理面试题总结2025【其一】
一、产品理解与定位 1、你如何理解产品经理这个角色? 作为一名互联网产品经理,我理解这个角色的核心在于成为产品愿景的制定者和执行的推动者。具体来说,产品经理是连接市场、用户和技术团队之间的桥梁,负责理解市场需求、用户痛…...
第16章:Python TDD实现多币种货币运算
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
【Web】2025-SUCTF个人wp
目录 SU_blog SU_photogallery SU_POP SU_blog 先是注册功能覆盖admin账号 以admin身份登录,拿到读文件的权限 ./article?filearticles/..././..././..././..././..././..././etc/passwd ./article?filearticles/..././..././..././..././..././..././proc/1…...
C++实现矩阵Matrix类 实现基本运算
本系列文章致力于实现“手搓有限元,干翻Ansys的目标”,基本框架为前端显示使用QT实现交互,后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…...
【GORM】初探gorm模型,字段标签与go案例
GORM是什么? GORM 是一个Go 语言 ORM(对象关系映射)库,它让我们可以使用结构体来操作数据库,而无需编写SQL 语句 GORM 模型与字段标签详解 在 GORM 中,模型是数据库表的抽象表示,字段标签&am…...
html全局遮罩,通过websocket来实现实时发布公告
1.index.html代码示例 <div id"websocket" style"display:none;position: absolute;color:red;background-color: black;width: 100%;height: 100%;z-index: 100; opacity: 0.9; padding-top: 30%;padding-left: 30%; padding-border:1px; "onclick&q…...
基于VSCode+CMake+debootstrap搭建Ubuntu交叉编译开发环境
基于VSCodeCMakedebootstrap搭建Ubuntu交叉编译开发环境 1 基于debootstrap搭建目标系统环境1.1 安装必要软件包1.2 创建sysroot目录1.3 运行debootstrap1.4 挂载必要的虚拟文件系统1.5 复制 QEMU 静态二进制文件1.6 进入目标系统1.7 使用目标系统(以安装zlog为例&a…...
C#中System.Text.Json:从入门到精通的实用指南
一、引言 在当今数字化时代,数据的高效交换与处理成为软件开发的核心环节。JSON(JavaScript Object Notation)凭借其简洁、轻量且易于读写的特性,已然成为数据交换领域的中流砥柱。无论是前后端数据交互,还是配置文件…...
【深度学习】Huber Loss详解
文章目录 1. Huber Loss 原理详解2. Pytorch 代码详解3.与 MSELoss、MAELoss 区别及各自优缺点3.1 MSELoss 均方误差损失3.2 MAELoss 平均绝对误差损失3.3 Huber Loss 4. 总结4.1 优化平滑4.2 梯度较好4.3 为什么说 MSE 是平滑的 1. Huber Loss 原理详解 Huber Loss 是一种结合…...
Maven下载配置
目录 Win下载配置maven的环境变量 Mac下载安装配置环境变量 MavenSetting.xml文件配置 Win 下载 https://maven.apache.org/ 在主页面点击Download 点击archives 最好不要下载使用新版本,我使用的是maven-3.6.3,我们点击页面下方的archives࿰…...
JS基础(5):运算符和语句
一.运算符 1.赋值运算符 加减乘除都是一样的,,-,*,/ 2.一元运算符:经常用来计数 自增: 每次只能加一 自减:-- 前置自增 后置自增 结…...
游戏引擎学习第81天
仓库:https://gitee.com/mrxiao_com/2d_game_2 或许我们应该尝试在地面上添加一些绘图 在这段时间的工作中,讨论了如何改进地面渲染的问题。虽然之前并没有专注于渲染部分,因为当时主要的工作重心不在这里,但在实现过程中,发现地…...
网络安全 | 什么是正向代理和反向代理?
关注:CodingTechWork 引言 在现代网络架构中,代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介,帮助管理、保护和优化数据流。根据代理的工作方向和用途,代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…...
前缀和——模板 二维前缀和
一.题目描述 【模板】二维前缀和_牛客题霸_牛客网 二.题目解析 这道题和上一道题有点异曲同工之妙。输入一个m行n列的矩阵,然后进行q次操作,每次操作输入4个数,作为两个点的坐标,计算这两个点为对角线的矩阵的和。 三.算法原理 …...
oracle使用case when报错ORA-12704字符集不匹配原因分析及解决方法
问题概述 使用oracle的case when函数时,报错提示ORA-12704字符集不匹配,如下图,接下来分析报错原因并提出解决方法。 样例演示 现在有一个TESTTABLE表,本表包含的字段如下图所示,COL01字段是NVARCHAR2类型࿰…...
高等数学学习笔记 ☞ 定积分与积分公式
1. 定积分的基本概念 1.1 定积分的定义 1. 定义:设函数在闭区间上有界。在闭区间上任意插入若干个分点,即, 此时每个小区间的长度记作(不一定是等分的)。然后在每个小区间上任意取,对应的函数值为。 为保证每段的值(即矩形面积)无…...
MLMs之Agent:Phidata的简介、安装和使用方法、案例应用之详细攻略
MLMs之Agent:Phidata的简介、安装和使用方法、案例应用之详细攻略 目录 Phidata简介 Phidata安装和使用方法 1、安装 2、使用方法 (1)、认证 (2)、创建 Agent (3)、运行 Agent (4)、Agent Playground Phidata 案例应用 1、多工具 Agent 2、多模态 Agent …...
如何在不暴露MinIO地址的情况下,用Spring Boot与KKFileView实现文件预览
在现代Web应用中,文件预览是一项常见且重要的功能。它允许用户在不上传或下载文件的情况下,直接在浏览器中查看文件内容。然而,直接将文件存储服务(如MinIO)暴露给前端可能会带来安全风险。本文将介绍如何在不暴露MinI…...
ESP8266固件烧录
一、烧录原理 1、引脚布局 2、引脚定义 3、尺寸封装 4、环境要求 5、接线方式 ESP8266系列模块集成了高速GPI0和外围接口,这可能会导致严重的开关噪声。如果某些应用需要高功率和EMI特性,建议在数字I/0线上串联10到100欧姆。这可以在切换电源时抑制过冲…...
Python 模拟真人鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
三天急速通关Java基础知识:Day1 基本语法
三天急速通关JAVA基础知识:Day1 基本语法 0 文章说明1 关键字 Keywords2 注释 Comments2.1 单行注释2.2 多行注释2.3 文档注释 3 数据类型 Data Types3.1 基本数据类型3.2 引用数据类型 4 变量与常量 Variables and Constant5 运算符 Operators6 字符串 String7 输入…...
免费使用 Adobe 和 JetBrains 软件的秘密
今天想和大家聊聊如何利用 Edu 教育邮箱免费使用 Photoshop、Illustrator 等 Adobe 系列软件,以及 JetBrains 开发工具。 首先,Adobe 的软件是设计师的必备工具。无论是处理图像的 Photoshop,还是进行矢量设计的 Illustrator,它们…...
Pytorch 自学笔记(三):利用自定义文本数据集构建Dataset和DataLoader
Pytorch 自学笔记(三) 1. Dataset与DataLoader1.1 torch.utils.data.Dataset1.2 torch.utils.data.DataLoader Pytorch 自学笔记系列的第三篇。针对Pytorch的Dataset和DataLoader进行简单的介绍,同时,介绍如何使用自定义文本数据集…...
gradle项目的创建和基本结构简介
文章目录 创建gradle项目(命令行)创建gradle项目(IDEA)项目基本结构和功能Gradle 构建流程测试类体验 创建gradle项目(命令行) yangMacdeMac-mini gradleStudy % gradle init Starting a Gradle Daemon (s…...
wow-agent---Day3 Zigent 智能代理开发框架
这个框架是课程讲解的,但资料比较少,觉得框架比较小众,所以这里只分析代码,打算把更多的精力放在metagpt的学习上,毕竟还是要学教为主流的框架,这对后续维护升级都有帮助,当然感兴趣作为研究&am…...
python 入门
1. Python 概述 1.1 简介 python 是一种面向对象的解释型编程语言,由吉多范罗苏姆开发; 1991 年,公开发行版发布; 因其可以将其他语言制作的模块轻松联接在一起,又被称作胶水语言; 1.2 优点 简单易学&…...
sentinel微服务保护
学习链接 SpringCloudRabbitMQDockerRedis搜索分布式 文章目录 学习链接1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel官网地址github地址…...
接口测试Day10-封装IHRM登录
-登录接口 普通方式实现 登录接口对象层 思路: 动态变化的,写入参数固定不变,直接写到方法实现内响应结果,通过返回值 return 分析: 封装实现: 登录接口测试用例层 封装断言方法 1、创建 文件 assert_uti…...
什么是IP地址、子网掩码、网关、DNS
简单解释 IP地址在网络中用于标识一个节点(或者网络设备的接口) IP地址用于IP报文在网络中的寻址 一个IPv4地址有32 bit。 IPv4地址通常采用“点分十进制”表示。 IPv4地址范围:0.0.0.0~255.255.255.255 网络部分:用来标识一个网络,代表IP地址所属网络。 主机部分:…...
python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测
角点检测(Corner Detection)是计算机视觉和图像处理中重要的步骤,主要用于提取图像中的关键特征,以便进行后续的任务,比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…...
软路由系统iStoreOS 一键安装 docker compose
一键安装命令 大家好!今天我来分享一个快速安装 docker-compose 的方法。以下是我常用的命令,当前版本是 V2.32.4。如果你需要最新版本,可以查看获取docker compose最新版本号 部分,获取最新版本号后替换命令中的版本号即可。 w…...
Invicti-Professional-V25.1
01 更新介绍 此更新包括对内部代理的更改。内部扫描代理的当前版本为 25.1.0。内部身份验证验证程序代理的当前版本为 25.1.0。#新功能现在,单击扫描摘要屏幕中的预设扫描图标会将您重定向到具有过滤视图的 “最近扫描” 页面,从而改进导航和对相关扫描…...
【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件
🔥 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用(Enabled) 2.3 坐标系(Geometry) **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题(windowTiltle&a…...
Spring WebFlux
文章目录 一、概述1、Spring体系定位2、Spring MVC和WebFlux差异 二、入门1、依赖2、ReactorHttpHandlerAdapter(main启动)3、DispatcherHandler(SpringWebFlux启动)4、WebFilter 三、DispatcherHandler理解1、handle 前置知识&am…...
【AI | pytorch】torch.polar的使用
一、torch.polar的使用 torch.polar 是 PyTorch 中用来生成复数张量的一个函数,但它与数学中的复数表达式 ( z re^{i\theta} ) 是等价的。 具体来说,torch.polar(abs, angle) 接受两个实数张量参数: abs:表示复数的模长&#…...
AWTK fscript 中的 输入/出流 扩展函数
fscript 是 AWTK 内置的脚本引擎,开发者可以在 UI XML 文件中直接嵌入 fscript 脚本,提高开发效率。本文介绍一下 fscript 中的 iostream 扩展函数 1.iostream_get_istream 获取输入流对象。 原型 iostream_get_istream(iostream) > object示例 va…...
【多线程】线程池
一、什么是线程池 线程池(Thread Pool)是一种多线程并发执行的设计模式,它通过维护一个线程集合来执行多个任务,避免频繁地创建和销毁线程,提高系统性能和响应速度。 就好比如你经营了一家餐饮店,你名下有…...
小结:路由器配置和管理 RIP协议
华为路由器中配置和管理 RIP(Routing Information Protocol)的相关指令主要分为以下几个部分:基础配置指令、接口配置指令、路由控制指令和调试指令。以下是总结: 1. 启用 RIP 协议 [Huawei] rip 1rip 1:表示创建并启…...