利用k*2+1k*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;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐