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字符串表示的二叉树)