1. 程式人生 > 資訊 >研究:蘋果允許使用者自行維修不太可能會影響 iPhone 的升級週期

研究:蘋果允許使用者自行維修不太可能會影響 iPhone 的升級週期

題目傳送門

#include <bits/stdc++.h>

using namespace std;
//2^7是極大值,就是 128是隊伍的最大值,完全二叉樹的最底層是128,上面肯定是127個,加在一起是255個,宣告一個大於255的數字N可以儲存的下
const int N = 260;
int value[N];  //每隊伍的能力值
int winner[N]; //勝利者的隊伍編號
int n;         //n支隊伍

//遍歷完美二叉樹
void dfs(int x) {
    //如果已經完成了所有隊伍的比較,返回
    if (x >= 1 << n) return;
    //左子樹,完成左側value陣列與winner陣列的填充
    dfs(2 * x);
    //右子樹,完成右側value陣列與winner陣列的填充
    dfs(2 * x + 1);
    //填充完畢後,可以大膽的使用了~
    int lvalue = value[2 * x], rvalue = value[2 * x + 1];
    //如果左結點獲勝
    if (lvalue > rvalue) {
        value[x] = lvalue; //記錄下獲勝方的能力值
        winner[x] = winner[2 * x];//和獲勝方的編號
    } else {//如果右結點獲勝
        value[x] = rvalue;//記錄下獲勝方的能力值
        winner[x] = winner[2 * x + 1];//和獲勝方的編號
    }
}

/**
 測試用例:
 3
 4 2 3 1 10 5 9 7
 */
int main() {
    //2^n次的n,用例是3,表示2^3=8,8支隊伍參加
    cin >> n;
    //讀入
    int m = 1 << n; //到底是幾支球隊?
    for (int i = 0; i < m; i++) {
        cin >> value[i + m]; //讀入各個節點的能力值,為什麼要i+m呢?因為完美二叉樹的儲存方法決定的。以n=3為例,手畫一下資料的儲存方式秒懂。
        winner[i + m] = i + 1;//葉子結點的獲勝方就是自己國家的編號,相當於初始化資料,沒有別人比賽之前,獲勝者是自己
    }
    dfs(1);//從根結點開始遍歷,遍歷每個節點

    cout << (value[2] > value[3] ? winner[3] : winner[2]);//找亞軍
    return 0;
}