P4715 【深基16.例1】淘汰赛

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;
}
posted @ 2020-11-23 22:50  HATU  阅读(143)  评论(0编辑  收藏  举报