【资源限制】
内存限制: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);
}
}