蓝桥杯关于#c++#的问题,如何解决?(语言-c++)


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/750280999776142.png "#left")

#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)$,否则会漏掉一些元素。另外,在计算最大值时,应该返回最大值所在的下标,而不是最大值