这种题我知道思路就是代码一直写不对,代码能力弱,以后拿这种题练练手。
前缀和思想:
每次要求一层的和,只要将这一层的最后一个数,减去上一层的最后一个数就可以了。这是前缀和的特性,快速求一段区间的和
最后一层可能不满,所以要特判。
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const int maxx=1e5+10;
int a[maxx],b[maxx];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]=a[i-1]+a[i];
}
int i,j;
for(i=1,j=1;j<=n;i++,j=(j<<1)+1){
b[i]=a[j]-a[j>>1];
}
if(j>n) b[i]=a[n]-a[j>>1];
int max1=-1,u=1;
for(int i=1;i<=n;i++){
if(b[i]>max1){
max1=b[i];
u=i;
}
}
cout<<u;
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f;
int main()
{
long long sum;// 记录每一深度的值
int n,x,max;
cin >> n;
max = -INF;
int ans = 0;//记录权值最大的深度值
int length = 1;
int depth = 1;
for(int i = 0; i < n; length*=2,depth++)
{
sum = 0;
for(int j=0; j < length && i < n; ++j,++i)
{
cin >> x;
sum = sum + x;
}
if(sum > max)
{
max = sum;
ans = depth;
}
}
cout << ans << endl;
return 0;
}
巧妙地dfs思想
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const int maxx=1e5+10;
int a[maxx],b[maxx],max1=-1;
int n,u;
void dfs(int l,int r,int n,int depth){
ll sum=0;
int i;
for(i=l;i<=r&&i<=n;i++) sum+=a[i];
if(sum>max1){
max1=sum;
u=depth;
}
if(i==n+1) return;
dfs(l*2,r*2+1,n,depth+1);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(1,1,n,1);
cout<<u;
return 0;
}