【蓝桥杯】历届真题 完全二叉树的权值(省赛)Java

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

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

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

        注:根的深度是1。

输入格式

        第一行包含一个整数N。

        第二行包含N个整数A1,A2,.…· AN 。

 【输出格式

        输出一个整数代表答案。

样例输入

7

1 6 5 4 3 2 1

样例输出

2

评测用例规模与约定

        对于所有评测用例,1≤N ≤ 100000,-100000 ≤ Ai ≤ 100000。

思路与分析

        1.将题中所给的信息元素录入数组。

        2.确定录入的元素需要多少个数组分别进行添加,(这里用到了高中的等比数列的和公式)

        a1*(q^n-1)/(q-1)

        3.对元素进行分割,利用ArrayList进行相应的成组元素的获取,(ArrayList不会受到数组元素长度的限制)

        4.将成组的元素放进list中的同时,对list中的元素进行相加,并存入到新的数组 sum 中去。

        5.获取到相应的成组的元素相加的和后,再进行相应大小的比较,确定最大的元素同时也确定了最终的结果,进行+1操作后即为答案。

代码

import java.util.ArrayList;
import java.util.Scanner;
 
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        int num = 0;
 
        for (int i = 0; i < 18; i++) {
            if (Math.pow(2, i) - 1 >= n) {
                num = i;
                break;
            }
        }
        int k = 0;
        int[] sum = new int[num];
        ArrayList<Integer> list = new ArrayList<>();
        for (int i=0; i<num; i++) {
            list.clear();
 
            if (i < num - 1) {
                for (int j = 0; j < Math.pow(2, i); j++) {
                    list.add(arr[k]);
                    k++;
                }
                for (int l = 0; l < list.size(); l++) {
                    sum[i] += list.get(l);
                }
            } else {
                for (int j = 0; j < n - (Math.pow(2, i) - 1); j++) {
                    list.add(arr[k]);
                    k++;
                }
                for (int m = 0; m < list.size(); m++) {
                    sum[i] += list.get(m);
                }
            }
 
        }
        int max = sum[0];
        int r = 0;
        for (int i = 1; i < sum.length; i++) {
            if (max < sum[i]) {
                max = sum[i];
                r = i;
            }
 
        }
        System.out.println(r +1);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值