该题题意很清晰
思路也比较容易想到
思路1:
使用数组存储树的结构,再利用树的性质对每一层的结点值叠加求最大值即可
#include<iostream>
#include<vector>
#include<climits>
#include<cmath>
#define int long long
using namespace std;
signed main()
{
int maxx = INT_MIN;
int n,value,ans=0;
vector<int>tree;
tree.push_back(0);//使得下标从1开始
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> value;
tree.push_back(value);
}
int deep = 0;//从第0层开始
while (1) {
int index1 = (int)pow(2, deep), index2 = (int)pow(2, deep + 1) - 1;//每一层结点的开始下标和结束下标
if (index1 > n)break;//如果开始下标越界
if (index2 > n) {//结束下标越界(没有那么多结点了)
index2 = n;
}
int temp = 0;
for (int i = index1; i <= index2; i++) {
temp += tree[i];//得到对应层数的结点和
}
if (temp > maxx) {
maxx = temp;//判断最大并记录
ans = deep;
}
deep++;//下一层
}
cout << ans + 1 << endl;//+1是因为上面我们默认从第0层开始
return 0;
}
思路2:
利用所学数据结构知识将数构造出来后利用层序遍历进行求最大值操作(这里比较复杂,没有写出代码)