UVa712(S树)


此题如果分析得当会发现本质上就是一个C语言的二-十进制转换。由于输入的S树的叶子节点是在xi已经排好序的基础上输入的,所以在解题时并不要考虑xi的顺序。

 1 #include 
 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