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
相关文章
相关标签/搜索