
#include
#include
using namespace std;
long long max(long long b[],long long length);
int main(){
long long j,i,n;
long long a[100001],b[100001]={0};
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
}
for(i=0;i<ceil(log(n+1)/log(2));i++){
for(j=pow(2,i);j<pow(2,i+1);j++){
b[i+1]+=a[j];
}
}
long long high;
high=max(b,ceil(log(n+1)/log(2)));
/*for(j=1;j<=log(n+1)/log(2);j++){
cout<
cout<return 0;
}
long long max(long long b[],long long length){
long long i,high=1;
for(i=2;i<=length;i++){
if(b[high]return high;
}
望采纳,
代码的作用是求出一个序列中长度为 $2^k$ 的子序列中,所有子序列的和的最大值。具体做法是将原序列分成若干个长度为 $2^k$ 的子序列,然后分别求出每个子序列的和,并找出其中的最大值。
该算法的时间复杂度为 $O(n\log n)$,其中 $n$ 是原序列的长度。具体来说,原序列被分成了 $\lceil\log_2(n+1)\rceil$ 个长度为 $2^k$ 的子序列,每个子序列的和可以在 $O(2^k)=O(\log n)$ 的时间内计算出来,因此总时间复杂度为 $O(n\log n)$。
需要注意的是,在计算子序列和时,代码中的循环应该从 $j=pow(2,i-1)+1$ 开始,而不是 $j=pow(2,i)$,否则会漏掉一些元素。另外,在计算最大值时,应该返回最大值所在的下标,而不是最大值