在输入时判断完,复杂度O(n)?
思路在注释里~
C++ 代码
总结:
- 用pow要加cmath头文件
- ans注意要用longlong, max初始化要足够小
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int tree[100010];
long long ans[100010];//ans[i]代表第i层的权值总和
int main()
{
long long n,m=1;//n代表节点总数,m代表当前层数
cin >> n;
long long max = -0x3f3f3f3f, now;//now代表当前权值总和最大的是哪层,max代表其权值总和是多少
for (int i = 1; i <= n; i++)//输入
{
scanf("%d", &tree[i]);//输入第i个节点的值
if (i > pow(2, m) - 1)//判断是否到了下一层,当前的层数是m,如果i>2^m-1说明已经是m+1层的节了,否则代表i仍是m层的节点
{
if (ans[m] > max)//由于目前的i是第m+1层,说明m层的权值总和已经算完了,此时判断第m层的权值总和是否是最大的,是则更新
{
max = ans[m];
now = m;
}
m++;//进入m+1层
}
ans[m] += tree[i];//i是m层的节点,所以第m层的节点总和要加上节点i的权值
}
if (ans[m] > max)//此时m是该二叉树的最后一层,而上述过程中我们只有在m变为m+1时才判断m层权值总和是否是所有层最大的,所以到了目前只判断了此二叉树倒数第二层是否是最大的,而最后一层没判断,此处补上,注意,如果没补上会卡点。
{
max = ans[m];
now = m;
}
cout << now;//输出结果ac了
return 0;
}