题解:深刻的教训 int->long long
#include<iostream>
#include<vector>
#include<cmath>
#include <climits>
using namespace std;
int main(){
//结点个数
int n = 0;
cin>>n;
//使用数组来存储树
vector<long long> tree(n+1);
for(int i = 1;i<=n;i++){
cin>>tree[i];
}
//以下标1为根结点的完全二叉树 左儿子结点是2*i,右儿子结点是2*i+1
//计算层数(深度) ceil向上取整
int deep = ceil(log(n+1)/log(2));
//每一层的结点个数为 2^(deep-1)
//最大结点权值和
int max_sum = -1e18 ;
//最大结点权值和对应的深度
int max_deep = 0;
for(int i = 1;i<= deep;i++){
long long sum = 0;
//每一层结点的起始值为:2^(deep-1) 终止值为2^deep-1
for(int x = pow(2,i-1);x<= (pow(2,i)-1) && x<=n;x++){
sum += tree[x];
}
// cout<<"第"<<i<<"层的结点权值和为:"<<sum<<endl;
//判断是否大于当前最大结点权值和 相等时不予变换
if(sum>max_sum){
max_sum = sum;
max_deep = i;
}
}
cout<<max_deep;
return 0;
}