解题思路:这道题是对二叉树的考察,算简单题,知道每层结点数的计算就可以了,每层结点数等于2^(k-1)。以及计算n个结点的二叉树的总层数 2^k - 1 = n 。知道层数以及每一层的结点数,然后按每一层每一层去算权值和即可。代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static int Int(String s) {
return Integer.parseInt(s);
}
public static void main(String[] args) throws IOException {
int n = Int(in.readLine());// 读取结点个数
// 计算层数,向上取整 2^k - 1 = n ==> k = log2(n+1),因为Math没有log2的函数,只能用换底公式实现log2(N)了
int hight = (int) Math.ceil((Math.log(n + 1) / Math.log(2)));
String[] s = in.readLine().split(" ");// 读取树的权值
int cnt = 0;// 数组的下标,记录当前读取的结点下标。
int depth = 1;// 最大权值和的层数,默认第一层
int max = Int(s[cnt++]);// 最大权值和,默认第一层结点的权值
for (int i = 2; i <= hight; i++) {// 从第二层开始
int N = (int) Math.pow(2, i - 1);// N是每层的个数 2^(k-1)
int sum = 0;// 每层的权值和
for (int j = 0; j < N && cnt < n; j++) {// 每层读取相应的个数,cnt<n确保最后一行的叶子结点不够当前层的结点个数(不过这道题已经说明完全二叉树了)
sum += Int(s[cnt++]);
}
if (max < sum) {// 当前层的权值和比之前的大,更新
depth = i;
max = sum;
}
}
System.out.println(depth);// 输出结果
}
}
做题时:一开始想复杂了打算采用二维数组来记录,i代表层数,j代表每层的结点,题目数据N最大等于100000,算出层数至少17层,最后一层63000+,觉得数组好像浪费了很多空间,打算new每层结点数大小的数组,傻了吧唧的,反应过来根本就不用定义数组哇,都想到了每层每层存储了,那直接每层权值加起来得到权值和 跟 前面的比不就好了。