题目链接https://www.luogu.com.cn/problem/P4715
根据满二叉树的性质:
1.满二叉树外观上是一个三角形
2.一个层数为k 的满二叉树总结点数为:2^k-1 (因此满二叉树的结点树一定是奇数个)
3.第i层上的结点数为:2^(k-1)
4.一个层数为k的满二叉树的叶子结点个数(也就是最后一层):
5.用一维数组存放满二叉树(如上图),除根节点外(设节点下标为h),该节点的父亲节点下标为h/2,左儿子节点下标为2*h,右儿子节点下标为2*h+1
理解上述原理后,可写出下面题解
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n, a[1<<9]; //a数组用于存储数据 4 int main() 5 { 6 cin>>n; 7 //根据满二叉树的性质,满二叉树叶子节点起始节点到最后节点下标为 2^n ~ 2^(n+1)-1 8 int s=1<<n; //满二叉树的叶子节点的起始下标 9 n=n+1; 10 int e=(1<<n)-1; //满二叉树的叶子节点的最后下标 11 for(int i=s, j=1; i<=e; i++) //输入叶子节点的数值 12 cin>>a[i]; 13 14 for(int i=e; i>=1; i=i-2) //叶子节点序号从大到小,构建满二叉树的逻辑结构 15 a[i/2]=max(a[i],a[i-1]); 16 17 int yj=min(a[2],a[3]); //银奖从2,3节点中获取最小值 18 19 for(int i=s; i<=e; i++) //从数组中找到银奖的输入序号 20 { 21 if(yj==a[i]){ 22 cout<<i-s+1; 23 break; 24 } 25 } 26 return 0; 27 }