#include<bits/stdc++.h>
using namespace std;
int comp(int a, int b){//返回大数
if(a > b) return a;
else return b;
}
void PK(vector<int> &arr, int n){//递归进行比赛直到决出冠军
if(n == 0) return;//停止条件
for(int i = pow(2, n) ; i < pow(2,n + 1) ; i+=2){//这一轮比赛,赢者晋级
arr[i / 2] = comp(arr[i], arr[i + 1]);
}
PK(arr, n - 1);//下一轮比赛
}
int main(){
int n;
cin >> n;
int N = pow(2, n + 1) ;//用数组来构建满二叉树
vector<int> arr(N, -1);
int temp;
for(int i = pow(2, n) ; i < N ; i++){
cin >> temp;
arr[i] = temp;
}
PK(arr, n);
temp = 999;
for(int i = 1; i < 4; i++){
if(arr[i] < temp) temp = arr[i];
}
for(int i = pow(2, n) ; i < N ; i++){
if(arr[i] == temp) cout << i - pow(2,n) + 1 << endl;
}
for(int i = 0; i < N; i++){
cout << arr[i] << ' ';
}
}
我是用一个大小为2n+1的数组来模拟这个满二叉树先在后面的2n范围内按顺序输入比赛的组合,然后两两比较晋级到下一层(我的数组从1开始,后面在同一个节点(假设下标为i)上的两个叶节点的下标就是2i和2i+1。从最底层开始决出冠军倒着来),递归直到决出冠军,然后在倒数第二局的晋级名单里选一个小一点的输出。题目的样例和然后我自己也写了一些样例都没问题但是只过了一个点QWQ