P4715 【深基16.例1】淘汰赛

题目链接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 }

 

posted @ 2020-08-12 21:07  TFLSNOI  阅读(306)  评论(0编辑  收藏  举报