【深基16.例1】淘汰赛
题目描述
有 2 n 2^n 2n( n ≤ 7 n\le7 n≤7)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?
输入格式
第一行一个整数 n n n,表示一共 2 n 2^n 2n 个国家参赛。
第二行 2 n 2^n 2n 个整数,第 i i i 个整数表示编号为 i i i 的国家的能力值( 1 ≤ i ≤ 2 n 1\leq i \leq 2^n 1≤i≤2n)。
数据保证不存在平局。
输出格式
仅一个整数,表示亚军国家的编号。
样例 #1
样例输入 #1
3
4 2 3 1 10 5 9 7
样例输出 #1
1
#include <bits/stdc++.h>
using namespace std;
#define MAX 300
int able[MAX] = {0};//存储对应国家的实力
int tree[MAX] = {0};//存储当前节点胜者的序号
int num;//总数
int solve(int now)
{if(now*2>num) //即没有子节点return tree[now];int a = solve(now*2);int b = solve(now*2+1);if(able[a]>able[b]) tree[now] = a;else tree[now] =b; return tree[now];
}
int main()
{int n;cin>>n;n = pow(2,n);//叶子节点所在层的第一个节点num = n*2-1;for(int i=1;i<=n;i++){cin>>able[i];tree[n+i-1] = i;} solve(1);if(tree[2] == tree[1]) cout<<tree[3];else cout<<tree[2];return 0;}