UVa 12166 修改天平

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 12166 修改天平相关的知识,希望对你有一定的参考价值。

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3318

题意:给一个深度不超过16的二叉树,代表一个天平。每根杆悬挂在中间,每个秤砣的重量已知,至少修改多少个秤砣的重量才能让天平平衡?

 

要让天平平衡,必须以其中一个秤砣作为标准,然后修改其余的秤砣。当以深度为d,值为x的叶子节点作为标准时,可以发现此时天平的总质量为x<<d。

因此可以遍历二叉树的每个叶子节点,在这里可以使用map容器,计算出秤砣总质量m所出现的次数,并且记录叶子节点数量number。这样,最后(number-map容器中最大的数)即为修改的最少次数。

一开始我不明白为什么要w*10,直接w<<depth不就行了,后来意识到如果是多位数就需要*10了...

 1 #include<iostream>
 2 #include<map>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 int number;
 9 string line;
10 map<long long, int> ans;
11 
12 void dfs(int depth, int s, int length)
13 {
14     if (line[s] == [)
15     {
16         int p = 0;
17         for (int i = s + 1; i<length; i++)
18         {
19             if (line[i] == [)  p++;
20             if (line[i] == ])  p--;
21             if (p == 0 && line[i] == ,)
22             {
23                 dfs(depth + 1, s + 1, i-1);
24                 dfs(depth + 1, i + 1, length - 1);
25             }
26         }
27     }
28     else {
29         long long w = 0;
30         for (int i = s; i <= length; i++)
31             w = w * 10 + line[i] - 0;
32         ++number;
33         ++ans[w << depth];
34     }
35 }
36 
37 int main()
38 {
39     int t;
40     int maxn;
41     cin >> t;
42     while (t--)
43     {
44         cin >> line;
45         ans.clear();
46         number = 0;
47         dfs(0, 0, line.size()-1);
48         maxn = 0;
49         map<long long, int>::iterator it = ans.begin();
50         for (; it != ans.end(); it++)
51         {
52             maxn = max(maxn, it->second);
53         }
54         cout << number - maxn << endl;
55     }
56     return 0;
57 }

 

以上是关于UVa 12166 修改天平的主要内容,如果未能解决你的问题,请参考以下文章

习题6-6 修改天平 (Equilibrium Mobile, NWERC 2008, UVa12166)

UVA - 12166 Equilibrium Mobile (修改天平)(dfs字符串表示的二叉树)

UVa12166 Equilibrium Mobile (二叉树结论)

UVa 1354 天平难题

二叉树的递归遍历 天平UVa839

6-9 天平 uva839