完全二叉树的权值——19年省赛

简介: 完全二叉树的权值——19年省赛

题目链接:

给定一棵包含 NN 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是A1,A2,⋅⋅⋅AN,如下图所示:

image.gif编辑

现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。

注:根的深度是 1。

输入描述

第一行包含一个整数 N。

第二行包含 N 个整数 A1,A2,⋅⋅⋅AN。

输出描述

输出一个整数代表答案。

输入输出样例

示例

输入

7
1 6 5 4 3 2 1

image.gif

输出

2

image.gif

运行限制

    • 最大运行时间:1s
    • 最大运行内存: 256M

    JAVA解法:

    import java.util.Scanner;
    // 1:无需package
    // 2: 类名必须Main, 不可修改
    public class Main {
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            //在此输入您的代码...
                    int n = scan.nextInt();
            int []tree = new int[n];
            int []a = new int[10000];
            for(int i = 0;i<tree.length;i++) {
                tree[i] = scan.nextInt();
            }
            int i = 0;
            int sum = 0;
            for(int j = 0;j<tree.length;j++) {
                a[i] += tree[j]; 
                sum++;
                if(sum == Math.pow(2, i)) {
                    i++;
                    sum = 0;
                }
            }
            int max = a[0];
            for(int x = 0;x<a.length;x++) {
                if(a[x] > max) {
                    max = a[x];
                }
            }
            for(int x = 0;x<a.length;x++) {
                if(a[x] == max) {
                    System.out.println(x+1);
                }
            }
            scan.close();
        }
    }

    image.gif

    C++解法:

    #include <cstdio>
    #include <cmath>
    using namespace std;
    const int N = 100010;
    int a[N];
    int main(){
        int n, res, sum = 0, dep = 1;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        res = a[1];
        int e = 1;
        for (int i = 2; i <= n; i++){
            sum += a[i];
            if (pow(2, e + 1) - 1 == i){
                if(sum > res){
                    res = sum;
                    dep = e + 1;
                }
                sum = 0;
                e ++ ;
            }
        }
        if(sum > res){
            res = sum;
            dep = e + 1;
        }
        printf("%d", dep);
        return 0;
    }

    image.gif

    相关文章
    |
    6月前
    leetcode-543:二叉树的直径
    leetcode-543:二叉树的直径
    34 0
    |
    存储 算法
    【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历
    【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历
    |
    6月前
    |
    算法 程序员
    【算法训练-二叉树 三】【最大深度与直径】求二叉树的最大深度、求二叉树的直径
    【算法训练-二叉树 三】【最大深度与直径】求二叉树的最大深度、求二叉树的直径
    64 0
    |
    6月前
    |
    机器学习/深度学习 人工智能 算法
    【图论 单源最短路】100276. 最短路径中的边
    【图论 单源最短路】100276. 最短路径中的边
    |
    6月前
    |
    存储 人工智能 BI
    树形dp总结
    树形dp总结
    50 0
    |
    11月前
    |
    算法 搜索推荐
    Kruskal算法
    Kruskal算法
    104 0
    leetcode 543:二叉树的直径
    leetcode 543:二叉树的直径
    52 0
    Leecode543. 二叉树的直径
    Leecode543. 二叉树的直径
    35 0
    LeetCode 543. 二叉树的直径
    LeetCode 543. 二叉树的直径
    94 0
    LeetCode 543. 二叉树的直径
    (卡壳笔记)1240. 完全二叉树的权值
    (卡壳笔记)1240. 完全二叉树的权值
    59 0