P4715 【深基16.例1】淘汰赛
简介
一道简单的二叉树题
题目
有 2的n次方 (n≤7) 个国家参加世界杯决赛圈且进入淘汰赛环节。我经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?
思路
我和一个憨憨一样按照题目意思模拟了一遍
f[j][i]:第i层,第j个数字,目前组中的最大
于是,按照题目的测试数据:
3
4 2 3 1 10 5 9 7
我们的 f 数组中即为:
4 2 3 1 10 5 9 7
4 3 10 9
4 10
10
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct con{
ll num,sco;
};
con f[1000][8];
ll n,n1;
ll cf(ll x){
ll ans=1;
for(int i=1;i<=x;i++) ans*=2;
return ans;
}
int main(){
cin>>n; n1=cf(n);
for(int i=1;i<=n1;i++) {
cin>>f[i][1].sco;
f[i][1].num=i;
}
if(n==1) {
if(f[1][1].sco>f[2][1].sco) cout<<f[2][1].num;
else cout<<f[1][1].num;
return 0;
}
for(int i=2;i<=n+1;i++){
ll n2=cf(n-i+1);
for(int j=1;j<=n2;j++) {
if(f[j*2-1][i-1].sco>f[j*2][i-1].sco){
f[j][i].num=f[j*2-1][i-1].num;
f[j][i].sco=f[j*2-1][i-1].sco;
}
else {
f[j][i].num=f[j*2][i-1].num;
f[j][i].sco=f[j*2][i-1].sco;
}
}
}
/*for(int i=1;i<=n+1;i++){
ll n2=cf(n-i+1);
for(int j=1;j<=n2;j++) cout<<f[j][i].sco<<" ";
cout<<endl;
}*/
if(f[1][n].sco>f[2][n].sco) cout<<f[2][n].num;
else cout<<f[1][n].num;
//cout<<f[1][n-1]<<endl;
return 0;
}