研究:蘋果允許使用者自行維修不太可能會影響 iPhone 的升級週期
阿新 • • 發佈:2021-11-24
#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; }