利用k*2+1
和 k*2
每次寻找k的儿子节点,寻找的时候记录层数
最后需要循环判断一下
注:判断不能再dfs中进行 因为最终的答案很有是某一层的某一时间段的结果 不是最终结果
#include <iostream>
#include <algorithm>
using namespace std;
const int n = 100005;
typedef long long ll;
int t[n];
int ans = 0;
ll maxt = -1e35;
int lcnt;
ll level[n];
int N;
void dfs(int k, int l)
{
if (k > N)
return;
// 记录有几层
lcnt = max(l, lcnt);
// 每次加入
level[l] += t[k];
dfs(k * 2, l + 1);
dfs(k * 2 + 1, l + 1);
}
int main()
{
cin >> N;
for (int i = 1; i <= N; i++)
scanf("%d", &t[i]);
dfs(1, 1);
for (int i = 1; i <= lcnt; i++)
{
if (maxt < level[i])
maxt = level[i], ans = i;
}
printf("%d", ans);
return 0;
}