• 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;
    }
    
  • 相关阅读:
    CCoolBar 的替代方案 CDockablePane。
    CTreeView 的教程
    散列表
    Add and Search Word
    Contains Duplicate II
    Word Search II
    Implement Trie (Prefix Tree)
    (转)多进程 & 多线程的区别与适用场景
    (转)进程控制:进程的创建、终止、阻塞、唤醒和切换
    (转)几个常用的操作系统进程调度算法
  • 原文地址:https://www.cnblogs.com/tushukai/p/14027720.html
Copyright © 2020-2023  润新知