#P1877. 淘汰赛1.填空题

淘汰赛1.填空题

题目描述

2n2^nn7n\le7)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?

输入格式

第一行一个整数 nn,表示一共 2n2^n 个国家参赛。

第二行 2n2^n 个整数,第 ii 个整数表示编号为 ii 的国家的能力值(1i2n1\leq i \leq 2^n)。

数据保证不存在平局。

输出格式

仅一个整数,表示亚军国家的编号。

3
4 2 3 1 10 5 9 7
1

样例解释
img

解题思路

这是一棵完美二叉树,叶子节点的最底层有 2n2^n 个叶子节点,所以这棵树有 n+1n+1 层。

所以,整棵树应该有 2n+112^{n+1} -1 个节点。第 n+1n+1 层节点的起始下标为 2n2^n

对于节点 iii1i-1 之间的比赛,胜出者可以放入 i/2i/2 (这是二叉树的一个特性)。

完成程序

#include<bits/stdc++.h>
using namespace std;
#define LC i*2
#define RC i*2+1

struct team
{
	int id, ability;
}x[1024];
int level,tot;
int main(){

	cin>>level; // 这棵完美二叉树有 level + 1 层

	int start = __填空(1)__; // 最底层最左端的叶子节点编号
	int tot = __填空(2)__; // 最底层的叶子节点数量
	for(int i=1,j=start; i<=__填空(3)__;i++,j++){
		cin>>x[j].ability;
		x[j].id=i;
	}

	for(int i=__填空(4)__;i>0;i--){
		if(x[LC].ability > x[RC].ability)
			x[i]=x[__填空(5)__];
		else
			x[i]=x[__填空(6)__];
	}


	if(x[2].ability < x[3].ability)
		cout<<__填空(7)__;
	else
		cout<<__填空(8)__;

	return 0;
}

填空(1):{{ input(1) }}

填空(2):{{ input(2) }}

填空(3):{{ input(3) }}

填空(4):{{ input(4) }}

填空(5):{{ input(5) }}

填空(6):{{ input(6) }}

填空(7):{{ input(7) }}

填空(8):{{ input(8) }}