http://oj.ecustacm.cn/problem.php?id=1457
其实还挺简单的,就是细节挺多的。
注意: 题目给的是完全二叉树,不是满二叉树。即最后一行不一定是满的。
本题的思路就是:
求每一行的和,找到最大的和的行。
1.先判断有几行
2.计算每一行的和找到最大的数。
#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[1000005];
int main(void)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int i,j;
for(i=1;i<=1000;i++)//找到有几行
{
if(n<(1<<i))// 2,4,8,16
{
break;
}
}
int number=i;//行数
int max=-99999999;
int max_index=0;
int index=0;//计算到哪里了
int sum=0;
bool flag=false;
for(i=1;i<=number;i++)
{
sum=0;
for(j=1;j<=pow(2,i-1);j++)//1 2 4 8每一行的数是递增的
{
sum=sum+a[index++];
if(index==n)//数都弄完了
{
flag=true;
}
}
if(sum>max)
{
max=sum;
max_index=i;
}
if(flag)
{
break;
}
}
printf("%d\n",max_index);
return 0;
}
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef long long ll;
int main(void)
{
int n; cin>>n;
ll max=-9999999,max_d=0;
for(int i=0,length=1,depth=1;i<n;depth++,length*=2)
{
ll s=0;
for(int j=0;j<length&&i<n;j++,i++)
{
int x;
cin>>x;
s+=x;
}
if(s>max)
{
max=s;
max_d=depth;
}
}
cout<<max_d<<endl;
return 0;
}