当前位置:   article > 正文

【华为OD】C卷真题 100分:寻找最富裕的小家庭 C语言代码实现[思路+代码]

【华为OD】C卷真题 100分:寻找最富裕的小家庭 C语言代码实现[思路+代码]

C++代码:

【华为OD】C卷真题 100分:寻找最富裕的小家庭 C/C++代码实现[思路+代码]-CSDN博客 

 题目描述

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

现给你一颗树,请计算出最富裕的小家庭的财富和。

输入描述

第一行为一个数 N,表示成员总数,成员编号 1~N。1 ≤ N ≤ 1000

第二行为 N 个空格分隔的数,表示编号 1~N 的成员的财富值。0 ≤ 财富值 ≤ 1000000

接下来 N -1 行,每行两个空格分隔的整数(N1, N2),表示 N1 是 N2 的父节点

输出描述

最富裕的小家庭的财富和

示例1

输入

4
100 200 300 500
1 2
1 3
2 4

输出

700 

      879                                                         
                                                            
              +---+                                                          
  3            |   |       ++                               +       +---|   
  |           |   | 3      +                6               +  |   +   |        +
  |      +     |   |       +         +                      +    |  +   |       +
  |      +    |   +---+    +        +        +++++          +   +  +   |        +
  |      +    | +      |   +   +----+        |   |          +   +  +   |        +
  |      +  3 | +      |   +   +    +      2 |   |     2    +   +  +   |        +
  |      +    | +      |   +   +    +        |   |          +   +  +   |        +
  |      +---+ +     |    |  |    +    ----+   |   +---+    |  |  +   |         +
  |      |     +     |    |  |    +    |       |   |   |    |  |  +   |         +
  |    1 |     +     | 8  |  |    +  1 |   |    | 1 |   | 1 |   |  +   |        +
  |      |     +     |    |  |    +    |   |    |   |   |   |   |  +   |        +
  |  +---+     +     +---+   |    ++---+    ++   +---+   +---+   |  +   |        +
  |  |         +         |   |    |         ++              |   |  |+   |        +
  |0 |         +         | 0 |  0 |         ++              | 0 |  |+   |        +
  |  |         +         |   |    |         ++              |   |  |+   |        +
  +---+         +          +-------+                       +---+| +|+   |        +
                +                                                    +   |        +
    0   1   2   3   4   5   6   7   8   9  10  11  12 + v:    w  u m    u 1 0 2 4

题目分析:

        这个按题目逻辑来处理即可,直接将当前父节点下的子节点值汇总到父节点即可,然后找出最大值

代码实现:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void bubbleSort(int* arr, int n) {
  4. int i, j, temp;
  5. for (i = 0; i < n-1; i++) {
  6. for (j = 0; j < n-i-1; j++) {
  7. if (arr[j] > arr[j+1]) {
  8. temp = arr[j];
  9. arr[j] = arr[j+1];
  10. arr[j+1] = temp;
  11. }
  12. }
  13. }
  14. }
  15. int main() {
  16. int n;
  17. scanf("%d", &n);
  18. // 动态分配数组
  19. int* first = (int*)malloc((n+1) * sizeof(int));
  20. int* second = (int*)malloc((n+1) * sizeof(int));
  21. // 初始化数组
  22. for (int i = 0; i <= n; i++) {
  23. first[i] = 0;
  24. second[i] = 0;
  25. }
  26. // 读取输入
  27. for (int i = 1; i <= n; i++) {
  28. scanf("%d", &first[i]);
  29. second[i] = first[i];
  30. }
  31. // 处理边
  32. for (int i = 0; i < n - 1; i++) {
  33. int p, s;
  34. scanf("%d %d", &p, &s);
  35. second[p] += first[s];
  36. }
  37. // 排序
  38. bubbleSort(second, n+1);
  39. // 输出最大值
  40. printf("%d\n", second[n]);
  41. // 释放内存
  42. free(first);
  43. free(second);
  44. return 0;
  45. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/194709
推荐阅读
相关标签
  

闽ICP备14008679号