思路
每次求出连续的两个人比赛的获胜者,直到人数还有两个(我们只记录最终结果,如果遍历到1时,则求不到第二名)时,将这两个人作比较即可。
AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Node{
int x,y;
};
int main(){
int n;
scanf("%d",&n);
n=1<<n;
struct Node arr[n+5];
for(int i=1;i<=n;i++) scanf("%d",&arr[i].y),arr[i].x=i;
int m=n,cnt=0;//m表示当前还剩余人数
while(true){
if(m==2) break;
cnt=1;
for(int i=1;i<=m;i+=2)
arr[i].y>arr[i+1].y?arr[cnt++]=arr[i]:arr[cnt++]=arr[i+1];
m/=2;
}
printf("%d",arr[1].y>arr[2].y?arr[2].x:arr[1].x);
return 0;
}