题目
思路
这道题比较简单,用到的是二叉树。
有人可能会问了:这道题看上去和二叉树没啥关系啊?一个简单的遍历(或者两个)不就可以啦?
啊对对对,你说的都对,这道题确实在代码实现过程中不需要建树,用到的是二叉树的思想!这就叫:心中有树,码字不慌!
……
来康康二叉树思想的部分,就是分别判断索引是在左边还是右边,再通过比较,求出两边的最大值,在输出的时候输出两个最大值的最小值就O了。
//i是索引,tmp是元素的值,k是元素总数
if(i<=k/2){
if(tmp>maxl) {
maxl=tmp;
idl=i;
}
}
else{
if(tmp>maxr){
maxr=tmp;
idr=i;
}
}
完整代码实现
#include <bits/stdc++.h>
using namespace std;
int n,maxl=0,maxr=0,tmp,idl,idr;
int main(){
cin>>n;
int k=pow(2,n);
for(int i=1;i<=k;i++){
cin>>tmp;
if(i<=k/2){
if(tmp>maxl) {
maxl=tmp;
idl=i;
}
}
else{
if(tmp>maxr){
maxr=tmp;
idr=i;
}
}
}
if(maxl>maxr) cout<<idr;
else cout<<idl;
return 0;
}
88~