本题的目的是找到权值最大的一层。
首先,我们需知道每层的数目的变化。第一层是1个数,第二层是 2个数,第三层是4个数,第四层是8个数。发现他们是2的0次方,2的1次方,2的2次方,2的3次方,因此,我们可以通过j循环来进行累加每一层的数目,j循环的开始我们在设置一个count,用来记录加到哪个数了,而2的多少次方,这个多少应该怎么弄呢?我们可以在最外层在加一个i循环来记录该多少次方了。
本题还需注意有可能最后一层不是满的,因此在j循环中需加入一个判断条件,如果所有数字加完后要提前结束,否则j循环将会一直执行,因此就会运行错误。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, sum=0, i;
int count=1; //用来记录总数,找到什么时候i循环结束。
int count2=1;//用来记录总数,有可能一层没有满就提前结束了。
int count1=0;//用来记加了几个。
cin>>n;
int a[n];
for(i=0;i<n;i++){
cin>>a[i];
}
int maxx=a[0];//找出最大值
int flag;//记录层数
for(i=1;i<n;i++){
for(int j=count;j<count+pow(2,i);j++){
sum+=a[j];
count1++;
count2++;
if(count2==n){
break;//可能出现这一层还没有满,但已经没有数字的情况
}
}
count+=count1;
if(sum>maxx){//比较找出最大值
maxx=sum;
flag=i+1;//记录最大值的层数
}
sum=0;
count1=0;
if(count==n){
break;//所有数已经输完,结束循环
}
}
cout<<flag;//输出层数
return 0;
}