题目
有(n≤7)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1号国家和2号国家踢一场比赛,胜者晋级。3号国家和4号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?
输入输出格式
输入格式
第一行一个整数n,表示一共个国家参赛。
第二行个整数,第i个整数表示编号为i的国家的能力值(1≤i≤)。
数据保证不存在平局。
输出格式
仅一个整数,表示亚军国家的编号。
输入输出样例
输入样例
3
4 2 3 1 10 5 9 7
输出样例
1
代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{
int power,id;
};
node a[150],tree[600];
node maxt(node a,node b){
return a.power>b.power?a:b;
}
node mint(node a,node b){
return a.power<b.power?a:b;
}
void build(int x,int start,int end){//建树函数
if(start==end){//如果到了根节点,直接放进tree数组
tree[x]=a[start];
return;
}
int lx=2*x,rx=2*x+1;
int mid=(start+end)/2;
build(lx,start,mid);//左子树建树
build(rx,mid+1,end);//右子树建树
tree[x]=maxt(tree[lx],tree[rx]);//返回的是左子树和右子树中最大的一个作为根节点
}
int main(){
int n;
cin>>n;
for(int i=1;i<=(1<<n);i++){
cin>>a[i].power;
a[i].id=i;
}
build(1,1,(1<<n));
cout<<mint(tree[2],tree[3]).id;//返回最小的一个作为亚军,最大的进上去作为冠军
return 0;
}