🐾或许会很慢,但是不可以停下🐾
文章目录
题目
- 完全二叉树包括非满二叉树
- 前缀和的数组下标从1开始
- log2() pow 函数
- 边界问题边界问题边界问题 手推 下次一定
双指针
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
ll res=a[1];
ll pos=1;
//计算每一层和
//考虑非满二叉树
for(int i=2;i<=log2(n)+1;i++) //i表示第几层
{
ll sum=0;
int t=pow(2,i)-1;
t=min(t,n);
for(int j=pow(2,i-1);j<=t;j++)
{
sum+=a[j];
}
if(sum>res)
{
res=sum;
pos=i;
}
}
cout<<pos;
return 0;
}
前缀和 也算双指针吧
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]+=a[i-1]; //前缀和
}
ll res=a[1];
ll pos=1;
//计算每一层和
//考虑非满二叉树
for(int i=2;i<=log2(n)+1;i++)
{
int t1=pow(2,i),t2=pow(2,i-1);
t1=min(n,t1-1);
ll temp=a[t1]-a[t2-1];
if(temp>res)
{
res=temp;
pos=i;
}
}
cout<<pos;
return 0;
}