思路:还以为要建一个二叉树呢,瞬间没思路了,事后放轻松看看题,一会儿就做出来了…心理素质堪忧啊
先用c记录这个树有几层,然后对每层,求出该层的最左边和最右边的下标,然后一个for循环求这一层的sum,找最大的sum,同时记录这一层是第几层;
对于最后一层,由于n可能小于等于2^n-1,所以注意一下。
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <iostream>
#define ll long long
using namespace std;
ll a[100010];
int main()
{
int i,j,n;
scanf("%d",&n);
for (i=1; i<=n; i++)
scanf("%lld",&a[i]);
int c=0;
ll sum=0;
ll m=n;
while(m)
{
m/=2;
c++;
}//求二叉树有多少层
int l,r;
ll maxx=-0x3f3f3f;
int max_c=0;
for (i=1; i<c; i++)
{
sum=0;
l=pow(2,i-1);
r=pow(2,i)-1;
for (j=l; j<=r; j++)
{
sum+=a[j];
}
if (sum>maxx)
{
maxx=sum;
max_c=i;
}
}
sum=0;
for (i=pow(2,c-1); i<=n; i++)
{
sum+=a[i];
}
if (sum>maxx)
{
maxx=sum;
max_c=c;
}
printf("%d\n",max_c);
return 0;
}