UVa 12166 - Equilibrium Mobile <二叉树+DFS>
2015-01-28 00:14
253 查看
A mobile is a type of kinetic sculpture constructed to take advantage of the principle of equilibrium. It consists of a number of rods, from which weighted objects or further rods hang. The objects hanging from the rods balance each other, so that the rods remain more or less horizontal. Each rod hangs from only one string, which gives it freedom to rotate about the string.We consider mobiles where each rod is attached to its string exactly in the middle, as in the figure underneath. You are given such a configuration, but the weights on the ends are chosen incorrectly, so that the mobile is not in equilibrium. Since that's not aesthetically pleasing, you decide to change some of the weights.What is the minimum number of weights that you must change in order to bring the mobile to equilibrium? You may substitute any weight by any (possibly non-integer) weight. For the mobile shown in the figure, equilibrium can be reached by changing the middle weight from 7 to 3, so only 1 weight needs to changed.
Input
On the first line one positive number: the number of testcases, at most 100. After that per testcase:One line with the structure of the mobile, which is a recursively defined expression of the form:<expr> ::= <weight> | "[" <expr> "," <expr> "]"with <weight> a positive integer smaller than 109 indicating a weight and [<expr>,<expr>] indicating a rod with the two expressions at the ends of the rod. The total number of rods in the chain from a weight to the top of the mobile will be at most 16.
Output
Per testcase:One line with the minimum number of weights that have to be changed.Sample Input
3 [[3,7],6] 40 [[2,3],[4,5]]
Sample Output
1 0 3
#include <bits/stdc++.h>using namespace std;int cur = 0;char str[1024000];map<long long, int> cnt;void DFS(int dep){ if(isdigit(str[cur])){ long long a = 0; while(isdigit(str[cur])) a = a * 10 + str[cur++] - '0'; cnt[a<<dep]++; } else{ cur++; DFS(dep + 1); cur++; DFS(dep + 1); cur++; }}int main(){ ios::sync_with_stdio(false); int T; cin >> T; cin.get(); while(cur = 0, cnt.clear(), T--) { cin >> str; DFS(0); int mx = INT_MIN, sum = 0; for(map<long long, int>::iterator it = cnt.begin(); it != cnt.end(); it++) sum += it->second, mx = max(mx, it->second); cout << sum - mx << endl; } return 0;}
相关文章推荐
- UVa 12166 - Equilibrium Mobile <二叉树+DFS>
- uva 10935 throwing cards away <queue>
- 7_3 分数拆分(UVa10976)<缩小枚举范围>
- 5_2 木块问题(UVa101)<vector的使用>
- UVa 1589 - Xiangqi <细节基础题>
- UVALIVE 3661 Animal Run <最大-最小原理之一 最大流-最小割原理>
- uva12166 - Equilibrium Mobile
- 6_6 小球下落(UVa679)<完全二叉树编号>
- UVa 818 - Cutting Chains <位运算+搜索>
- UVA 3902 <无根树转变成有根树> <根据深度寻找k级祖先>
- UVa 818 - Cutting Chains <位运算+搜索>
- UVA 11624 <《经典bfs》迷宫逃亡之追击问题---火追人>
- 7_4 素数环(UVa524)<回溯法和生成-测试法的比较>
- UVa 1374 - Power Calculus <IDA*算法>
- 4_1 古老的密码(UVa1339)<排序>
- 7_5 困难的串(UVa129)<回溯法:避免无用判断>
- UVa 1025 <DP>
- UVa 1599 - Ideal Path <两次BFS>
- UVa 506 - System Dependencies <图的拓扑序+STL应用>
- 6_7 树的层次遍历(UVa122)<二叉树的动态创建与BFS>