代码:
/*
样例测试:
7
1 6 5 4 3 2 1 //返回值是2
7
1 6 5 4 3 2 2 //第2层和第三层之和都为最大值 ,返回值是1
15
1 3 8 10 18 13 15 6 4 2 9 4 5 2 3 //返回值是3
15
1 3 8 10 18 13 15 20 10 5 5 5 5 3 3 //第三层和第四层之和都为最大值,返回值是2
15
1 3 8 9 4 5 2 6 4 2 10 18 13 15 3//返回值是4
31
1 3 8 10 18 13 15 20 10 5 5 5 5 3 3 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10//第三层和第四层之和都为最大值,返回值是2
*/
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
#define MAX 100005
int m[MAX];
int n;
int t;//用于记录层数
int main()
{
int max = 0;
int min = 0x3f3f3f3f;//将每层之和的最小值 设为正无穷大
int big = 0;//用于返回每层之和最大对应的层号
int small = 0; //用于返回每层之和最小对应的层号
int ans = 0;//用于判断每层之和的最大值是否唯一
cin >> n;
for(int i =0;i<n;i++)
{
cin >> m[i];
}
//此处的层数是从0开始计算的。为了方便下面的计算
for(int i = 1;i<=n;i++)
{
if(pow(2,i) > n)
{
t = i-1;
//cout<<"层数为: "<<t<<endl;
break;
}
}
int k =0;//用于从数组中对应的位置开始将每层的数进行相加
for(int i = 0;i<=t;i++)//外层循环是层数
{
int sum = 0;
for(int j = 0;j<pow(2,i);j++)//内层循环是计算每层数的和
{
sum += m[k++];
}
if(max <= sum)
{
if(ans > 0) //当之前记录两个相同的最大值后,ans已经非0,但是来了一个更大的最大值后,要将ans置为0
{
ans = 0;
}
if(max == sum)//如果有相同的最大值
{
ans++;
}
max = sum;//用于存储最大值
big = i+1;
}
if(sum < min)
{
min = sum;
small = i+1;
}
}
//cout << "ans = "<<ans<<endl;
if(ans == 0)
{
//cout << "每层之和最大值对应的层号为: "<< big <<endl;
cout<<big<<endl;
}
else if(ans > 0)
{
//cout << "每层之和最小值对应的层号为: "<< small <<endl;
cout << small << endl;
}
return 0;
}