UVa712(S樹)

此題若是分析得當會發現本質上就是一個C語言的二-十進制轉換。因爲輸入的S樹的葉子節點是在xi已經排好序的基礎上輸入的,因此在解題時並不要考慮xi的順序。c++

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;  4 
 5 /****************  6 UVa712 S樹  7 ***************/
 8 
 9 int main() 10 { 11     //deep:樹的深度 
12     int deep = 0; 13     cin >> deep; 14     //STree:存儲葉子的數組 pow(2, deep)是葉子的個數 
15     int max = pow(2, deep); 16     int STree[max]; 17     memset(STree, -1, sizeof(STree)); 18     for(int i = 0; i < max; i++){ 19         cin >> STree[i]; 20  } 21     
22     //num:表達式的個數 
23     int tmp = 0, num = 0; 24     cin >> num; 25     //存儲xi的值 
26     vector<int> v; 27     //存儲答案 
28     vector<int> ans; 29     int res = 0, h = 0; 30     while(num--){ 31         int k = 0; 32  v.clear(); 33         //輸入表達式 
34         for(int i = 0; i < deep; i++){ 35             cin >> tmp; 36  v.push_back(tmp); 37  } 38         res = 0; 39         //將查詢式轉變爲十進制值 
40         while(!v.empty()){ 41             int ch = v.back(); 42  v.pop_back(); 43             res += ch*pow(2, (k++)); 44  } 45  ans.push_back(res); 46  } 47     for(int i = 0; i < ans.size(); i++){ 48         cout << STree[ans[i]]; 49  } 50     cout << endl; 51     return 0; 52 } 

輸出結果:數組

3
0 0 0 0 0 1 1 1
4
0 0 0
0 1 0
1 1 1
1 1 0
0011
相關文章
相關標籤/搜索