#P1878. 淘汰赛2.填空题
淘汰赛2.填空题
题目描述
有 k 个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?
输入格式
第一行一个整数 ,表示一共 个国家参赛。( )
第二行 个整数,第 个整数表示编号为 的国家的能力值()。
数据保证不存在平局。
输出格式
仅一个整数,表示亚军国家的编号。
8
4 2 3 1 10 5 9 7
1
提示
这是一棵完全二叉树,只有底下的一层是没有填满,而且可以刻意让没填满的节点出现在右侧。
完成程序
#include<bits/stdc++.h>
using namespace std;
const int Maxn = 400001;
// 这是一个重要的知识点,完全二叉树,最后一层是 n,整棵树节点数接近 4*n
struct Team {
int id, ability;
// 重载 < 运算符
bool operator < (const Team &other) const{
return __填空(1)__;
}
}x[Maxn];
int main() {
int k;
scanf("%d", &k);
int level=0;
while(__填空(2)__) level ++;
// 这棵树有 level 层
//前面的 level-1 层有 2^level-1 个节点,第 level 层的开始下标是 2^level
int j=__填空(3)__; // j 是底层叶子节点的下标
for(int i=1; __填空(4)__;i++,j++){
cin>>x[j].ability;
x[j].id = i;
}
j--;
for(int i=j;i>0;i-=2){
x[__填空(5)__] = x[i]<x[i-1] ? __填空(6)__; // 三目运算,填写后两目
}
printf("%d", x[2]<x[3]? __填空(7)__ : __填空(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) }}