40分求助
查看原帖
40分求助
1159589
oKdm楼主2024/6/15 09:08
#include <iostream>
#include <cmath>
using namespace std;

int teams[133] = { };//能力值
int n,N;//N是2^n(总队伍数)

int main() {
    cin >> n;//输入n
    N = pow(2,n);//N是2^n(总队伍数)
    for(int i = 1; i <= N; i++){
        cin >> teams[i];//输入能力值
    }
    int ansnum;//答案队伍能力值
    int anspos;//答案队伍编号
    for(int i = 1; i <= n; i++){//每一轮
        if(i == n){//最后一轮
            for(int j = 1; j <= N; j = j + pow(2,i)){//两两比较
                int pow_2_i_1 = pow(2,i-1);
                if(teams[j] < teams[pow_2_i_1 + j]){//队伍能力值小于前一队伍能力值
                    ansnum = teams[j];//设置答案
                    break;//退出循环
                }
                else{//队伍能力值大于前一队伍能力值
                    ansnum = teams[pow_2_i_1 + j];//设置答案
                    break;//退出循环
                }
            }
        }
        else {//非最后一轮
            for (int j = 1; j <= N; j = j + pow(2, i)) {//两两比较
                int pow_2_i_1 = pow(2, i - 1);
                if (teams[j] > teams[j + pow_2_i_1]) {//队伍能力值大于后一队伍能力值
                    teams[j + pow_2_i_1] = -1;//后一队伍标记为-1
                } 
                else {
                    swap(teams[j], teams[j + pow_2_i_1]);//交换两队伍位置
                    teams[j + pow_2_i_1] = -1;//后一队伍标记为-1
                }
            }
        }
    }
    for(int i = 1; i <= N; i++){//查找答案队伍编号
        if(teams[i] == ansnum){//找到答案队伍编号
            anspos = i;//设置答案队伍编号
            break;//退出循环
        }
    }
    cout << anspos << endl;//输出答案队伍编号
    return 0;
}
2024/6/15 09:08
加载中...