本题可以利用双指针算法来做
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
typedef long long LL;
int a[N];
int depth;//表示最终的层数
int n;
int imax = -1e18;
int main()
{
cin >> n;
for(int i = 1;i <= n;i++) cin >> a[i];
//d表示层数,i表示每一层的起点,通过找规律可以得出
//遍历完每一层,下一层的起点是上一层起点的2倍
for(int d = 1,i = 1;i <= n;d++,i *= 2)
{
LL sum = 0;//需要在内部写,每次清零,来计算这一层的和
for(int j = i;j < i + (1 << d - 1) && j <= n;j++)
//j从这一层的起点开始,通过找规律可以得出i + (1 << d - 1)
//也可以用pow()来写,需要注意的是,这一层的子节点可能并不是
//满的状态,所以要加一个j <= n的条件
{
sum += a[j];
}
if(sum > imax)
{
imax = sum;
depth = d;
}
}
cout << depth << endl;
return 0;
}