华为OD机试C卷 - 最富裕的小家庭( Python C C++ JavaGo JS PHP)

2024-02-09 00:12

本文主要是介绍华为OD机试C卷 - 最富裕的小家庭( Python C C++ JavaGo JS PHP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值。一个小家庭由一个节点及其直接相连的子节点组成。

现在给定一颗树,我们需要计算最富裕的小家庭的财富和。

输入描述

输入包括以下几行:

  1. 一个整数N,表示树中家庭成员的总数,1 ≤ N ≤ 1000。
  2. N个由空格分隔的整数,表示每个家庭成员的财富值,-100 ≤ 财富值 ≤ 1000000。
  3. N-1行,每行包含两个由空格分隔的整数(N1, N2),表示N1是N2的父亲。

输出描述

输出一个整数,表示最富裕的小家庭的财富和。

用例

在这里插入图片描述

题目解析

首先,我们需要明确题目要求。题目描述了一个树形结构,每个节点代表一个家庭成员,节点的数字表示其个人的财富值。一个小家庭由一个节点及其直接相连的子节点组成。我们需要计算最富裕的小家庭的财富和。

为了解决这个问题,我们可以使用深度优先搜索(DFS)来遍历树形结构。在DFS过程中,我们可以记录每个小家庭的财富值,并找到最富裕的小家庭。

具体步骤如下:

  1. 创建一个字典family,用于记录每个节点的子节点及其财富值。
  2. 创建一个字典family_wealth,用于记录每个小家庭的财富值。初始时,将字典中的所有值都设为0。
  3. 创建一个变量max_wealth,用于记录最富裕的小家庭的财富值。初始时,将max_wealth设为0。
  4. 使用DFS遍历树形结构,对于每个节点:
    • 如果当前节点不是叶子节点,则递归遍历其子节点。
    • 计算当前小家庭的财富值,并将其存储在family_wealth中。当前小家庭的财富值为当前节点的财富值加上其子节点的财富值之和。
    • 如果当前小家庭的财富值大于max_wealth,则更新max_wealth为当前小家庭的财富值。
  5. 输出最富裕的小家庭的财富值。

Python代码实现

# 定义一个函数,用于计算小家庭的财富和
def calculate_family_wealth(node, family, family_wealth):# 如果当前节点不是叶子节点,则递归遍历其子节点if len(family[node]) > 0:for child in family[node]:calculate_family_wealth(child, family, family_wealth)# 计算当前小家庭的财富值,并将其存储在 family_wealth 中family_wealth[node] = family_wealth.get(node, 0) + family[node][0]# 更新最富裕的小家庭的财富值if family_wealth[node] > max_wealth:max_wealth = family_wealth[node]# 初始化变量和字典
max_wealth = 0  # 最富裕的小家庭的财富值
family = {}  # 记录每个节点的子节点及其财富值
family_wealth = {}  # 记录每个小家庭的财富值# 读取输入数据
N = int(input().strip())  # 家庭成员的总数
family_wealth[1] = int(input().strip())  # 第一个家庭成员的财富值,也是整个家庭的财富值
family[1] = []  # 第一个家庭成员没有子节点
for i in range(2, N+1):node = int(input().strip())  # 当前家庭成员的编号wealth = int(input().strip())  # 当前家庭成员的财富值parent = int(input().strip())  # 当前家庭成员的父亲编号family[node] = []  # 初始化当前家庭成员的子节点列表family[parent].append(node)  # 将当前家庭成员添加为其父亲的子节点family_wealth[node] = wealth  # 记录当前家庭成员的财富值# 使用深度优先搜索遍历树形结构,计算最富裕的小家庭的财富和
calculate_family_wealth(1, family, family_wealth)# 输出最富裕的小家庭的财富和
print(max_wealth)

C代码实现

#include <stdio.h>
#include <stdbool.h> int max_wealth; // 定义最大财富
int family[100001][2]; // 定义一个二维数组来存储家族关系
int family_wealth[100001]; // 定义一个数组来存储每个成员的财富void calculate_family_wealth(int node, int (*family)[2], int *wealth) 
{ // 定义一个函数来计算家族财富if (family[node][0] > 0) { // 如果该成员有孩子for (int i = 0; i < family[node][0]; i++) { // 遍历该成员的所有孩子calculate_family_wealth(family[node][1 + i], family, wealth); // 递归计算每个孩子的财富}}family_wealth[node] = family_wealth[node] + family[node][0]; // 加上该成员的财富if (family_wealth[node] > max_wealth) { // 如果该成员的财富比最大财富还要多max_wealth = family_wealth[node]; // 更新最大财富}
}int main() {int N; // 定义一个变量来存储家族人数scanf("%d", &N); // 读取家族人数scanf("%d", &family_wealth[1]); // 读取第一个成员的财富max_wealth = family_wealth[1]; // 将最大财富初始化为第一个成员的财富for (int i = 2; i <= N; i++) { // 遍历家族中的所有成员int node, wealth, parent; // 定义三个变量来存储当前成员的信息scanf("%d %d %d", &node, &wealth, &parent); // 读取当前成员的信息family[node][0] = 0; // 将当前成员的子节点数初始化为0family[parent][0]++; // 将父节点的孩子数加1family[parent][family[parent][0]++] = node; // 将当前成员添加到父节点的子节点数组中family_wealth[node] = wealth; // 将当前成员的财富初始化为输入的财富}calculate_family_wealth(1, family, family_wealth); // 调用函数计算家族财富printf("%d\n", max_wealth); // 输出最大财富return 0; // 程序结束
}

C++代码实现

#include <iostream>
#include <vector>int max_wealth; // 定义最大财富
std::vector<std::vector<int>> family; // 定义一个二维数组来存储家族关系
std::vector<int> family_wealth; // 定义一个数组来存储每个成员的财富void calculate_family_wealth(int node, const std::vector<std::vector<int>>& family, std::vector<int>& wealth) 
{ // 定义一个函数来计算家族财富if (family[node][0] > 0) { // 如果该成员有孩子for (int i = 0; i < family[node][0]; i++) { // 遍历该成员的所有孩子calculate_family_wealth(family[node][1 + i], family, wealth); // 递归计算每个孩子的财富}}family_wealth[node] = family_wealth[node] + family[node][0]; // 加上该成员的财富if (family_wealth[node] > max_wealth) { // 如果该成员的财富比最大财富还要多max_wealth = family_wealth[node]; // 更新最大财富}
}int main() {int N; // 定义一个变量来存储家族人数std::cin >> N; // 读取家族人数std::cin >> family_wealth[1]; // 读取第一个成员的财富max_wealth = family_wealth[1]; // 将最大财富初始化为第一个成员的财富for (int i = 2; i <= N; i++) { // 遍历家族中的所有成员int node, wealth, parent; // 定义三个变量来存储当前成员的信息std::cin >> node >> wealth >> parent; // 读取当前成员的信息family[node].resize(1, 0); // 将当前成员的子节点数初始化为0family[parent][0]++; // 将父节点的孩子数加1family[parent].push_back(node); // 将当前成员添加到父节点的子节点数组中family_wealth[node] = wealth; // 将当前成员的财富初始化为输入的财富}calculate_family_wealth(1, family, family_wealth); // 调用函数计算家族财富std::cout << max_wealth << std::endl; // 输出最大财富return 0; // 程序结束
}

Java代码实现

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {static int max_wealth; // 定义最大财富static List<List<Integer>> family; // 定义一个二维数组来存储家族关系static List<Integer> family_wealth; // 定义一个数组来存储每个成员的财富public static void calculate_family_wealth(int node, List<List<Integer>> family, List<Integer> wealth) { // 定义一个函数来计算家族财富if (family.get(node).get(0) > 0) { // 如果该成员有孩子for (int i = 0; i < family.get(node).get(0); i++) { // 遍历该成员的所有孩子calculate_family_wealth(family.get(node).get(1 + i), family, wealth); // 递归计算每个孩子的财富}}family_wealth.set(node, family_wealth.get(node) + family.get(node).get(0)); // 加上该成员的财富if (family_wealth.get(node) > max_wealth) { // 如果该成员的财富比最大财富还要多max_wealth = family_wealth.get(node); // 更新最大财富}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N; // 定义一个变量来存储家族人数System.out.println("请输入家族人数:");N = scanner.nextInt(); // 读取家族人数System.out.println("请输入第一个成员的财富:");family_wealth.add(1, scanner.nextInt()); // 读取第一个成员的财富,并将其添加到成员财富列表中max_wealth = family_wealth.get(1); // 将最大财富初始化为第一个成员的财富for (int i = 2; i <= N; i++) { // 遍历家族中的所有成员int node, wealth, parent; // 定义三个变量来存储当前成员的信息System.out.println("请输入当前成员的信息:");node = scanner.nextInt();wealth = scanner.nextInt();parent = scanner.nextInt();family.add(node, new ArrayList<>()); // 将当前成员添加到家族关系列表中family.get(parent).add(node); // 将当前成员添加到父节点的子节点数组中family_wealth.add(node, wealth); // 将当前成员的财富初始化为输入的财富}calculate_family_wealth(1, family, family_wealth); // 调用函数计算家族财富System.out.println("最大财富为:" + max_wealth); // 输出最大财富}
}

Go代码实现

package mainimport ("fmt""io""strings""stdio"
)func main() {var maxWealth intvar family [][]intvar familyWealth []intfmt.Readln(&N) // 读取家族人数fmt.Readln(&familyWealth[1]) // 读取第一个成员的财富maxWealth = familyWealth[1] // 将最大财富初始化为第一个成员的财富for i := 2; i <= N; i++ { // 遍历家族中的所有成员var node, wealth, parent intfmt.Readln(&node, &wealth, &parent) // 读取当前成员的信息family[node] = append(family[node], 0) // 将当前成员的子节点数初始化为0family[parent][0]++ // 将父节点的孩子数加1family[parent] = append(family[parent], node) // 将当前成员添加到父节点的子节点数组中familyWealth[node] = wealth // 将当前成员的财富初始化为输入的财富}calculateFamilyWealth(1, family, familyWealth) // 调用函数计算家族财富fmt.Println(maxWealth) // 输出最大财富
}func calculateFamilyWealth(node int, family [][]int, familyWealth []int) {if family[node][0] > 0 { // 如果该成员有孩子for i := 0; i < family[node][0]; i++ { // 遍历该成员的所有孩子calculateFamilyWealth(family[node][1+i], family, familyWealth) // 递归计算每个孩子的财富}}familyWealth[node] = familyWealth[node] + family[node][0] // 加上该成员的财富if familyWealth[node] > maxWealth { // 如果该成员的财富比最大财富还要多maxWealth = familyWealth[node] // 更新最大财富}
}

PHP代码实现

<?php$max_wealth = 0; // 定义最大财富
$family = array(); // 定义一个二维数组来存储家族关系
$family_wealth = array(); // 定义一个数组来存储每个成员的财富function calculate_family_wealth($node, $family, $wealth) { // 定义一个函数来计算家族财富if ($family[$node][0] > 0) { // 如果该成员有孩子for ($i = 0; $i < $family[$node][0]; $i++) { // 遍历该成员的所有孩子calculate_family_wealth($family[$node][1 + $i], $family, $wealth); // 递归计算每个孩子的财富}}$family_wealth[$node] = $family_wealth[$node] + $family[$node][0]; // 加上该成员的财富if ($family_wealth[$node] > $max_wealth) { // 如果该成员的财富比最大财富还要多$max_wealth = $family_wealth[$node]; // 更新最大财富}
}public function main() {$scanner = new Scanner(STDIN);$N = 0; // 定义一个变量来存储家族人数echo "请输入家族人数:<br>";$N = $scanner->nextInt(); // 读取家族人数echo "请输入第一个成员的财富:<br>";$family_wealth[] = $scanner->nextInt(); // 读取第一个成员的财富,并将其添加到成员财富列表中$max_wealth = $family_wealth[1]; // 将最大财富初始化为第一个成员的财富for ($i = 2; $i <= $N; $i++) { // 遍历家族中的所有成员$node = 0;$wealth = 0;$parent = 0;echo "请输入当前成员的信息:<br>";$node = $scanner->nextInt();$wealth = $scanner->nextInt();$parent = $scanner->nextInt();$family[] = array($node, array()); // 将当前成员添加到家族关系列表中$family[$parent][] = $node; // 将当前成员添加到父节点的子节点数组中$family_wealth[] = $wealth; // 将当前成员的财富初始化为输入的财富}calculate_family_wealth(1, $family, $family_wealth); // 调用函数计算家族财富echo "最大财富为:" . $max_wealth; // 输出最大财富
}main();

JS代码实现


const maxWealth = 0; // 定义最大财富
const family = new Array(100001).fill(0).map(() => new Array(2).fill(0)); // 定义一个二维数组来存储家族关系
const familyWealth = new Array(100001).fill(0); // 定义一个数组来存储每个成员的财富function calculateFamilyWealth(node, family, wealth) { // 定义一个函数来计算家族财富if (family[node][0] > 0) { // 如果该成员有孩子for (let i = 0; i < family[node][0]; i++) { // 遍历该成员的所有孩子calculateFamilyWealth(family[node][1 + i], family, wealth); // 递归计算每个孩子的财富}}familyWealth[node] = familyWealth[node] + family[node][0]; // 加上该成员的财富if (familyWealth[node] > maxWealth) { // 如果该成员的财富比最大财富还要多maxWealth = familyWealth[node]; // 更新最大财富}
}async function main() {const N = parseInt(prompt("请输入家族人数:")); // 读取家族人数familyWealth[1] = parseInt(prompt("请输入第一个成员的财富:")); // 读取第一个成员的财富maxWealth = familyWealth[1]; // 将最大财富初始化为第一个成员的财富for (let i = 2; i <= N; i++) { // 遍历家族中的所有成员const node = i; // 定义一个变量来存储当前成员的编号const wealth = parseInt(prompt("请输入当前成员的财富:")); // 读取当前成员的财富const parent = parseInt(prompt("请输入当前成员的父节点编号:")); // 读取当前成员的父节点编号family[parent][0]++; // 将父节点的孩子数加1family[parent][family[parent][0]++] = node; // 将当前成员添加到父节点的子节点数组中familyWealth[node] = wealth; // 将当前成员的财富初始化为输入的财富}calculateFamilyWealth(1, family, familyWealth); // 调用函数计算家族财富console.log(maxWealth); // 输出最大财富
}
main();

这篇关于华为OD机试C卷 - 最富裕的小家庭( Python C C++ JavaGo JS PHP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692622

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及