UVa 12166 Equilibrium Mobile——思路题
2017-06-11 15:11
351 查看
由平衡可知父节点的质量等于子节点的两倍,某层的质量等于他下面一层质量的两倍,最终第0层的质量就是整棵树的质量(这里的质量其实类似于一种权值的累加,不是实际质量,不要误以为是所有叶子质量之和。。。。。。)
以1片叶子为基点,则1片叶子就可以决定1棵树的质量;
以n片叶子为基点,则n片叶子就可以决定n棵树的质量;
如果n棵树中有两棵树的质量相同,则作为他们基点的两片叶子是不用修改的; 如果n棵树中有三棵树质量相同,则作为他们基点的三片叶子是不用修改的。。。。。。
如果n棵树中有m棵树质量相同,则作为他们基点的m片叶子是不用修改的。
最终需要修改的叶子就为n-m片
以1片叶子为基点,则1片叶子就可以决定1棵树的质量;
以n片叶子为基点,则n片叶子就可以决定n棵树的质量;
如果n棵树中有两棵树的质量相同,则作为他们基点的两片叶子是不用修改的; 如果n棵树中有三棵树质量相同,则作为他们基点的三片叶子是不用修改的。。。。。。
如果n棵树中有m棵树质量相同,则作为他们基点的m片叶子是不用修改的。
最终需要修改的叶子就为n-m片
#include <bits/stdc++.h> using namespace std; int main() { string s; map<long long, int> m; map<long long, int>::iterator it; int T; cin >> T; while (T--) { cin >> s; m.clear(); int deep = 0, a = 0, b = 0; for (int i = 0; i < s.size(); i++) { if (s[i] == '[') deep++; else if (s[i] == ']') deep--; else if (isdigit(s[i])) { a++; long long sum = 0; while (isdigit(s[i])) { sum = sum * 10 + s[i++] - '0'; } sum = sum * (1<<deep); m[sum]++; i--; } } for (it = m.begin(); it != m.end(); it++) b = max(b, it->second); cout << a - b << endl; } return 0; }
相关文章推荐
- uva12166 修改天平 元素的贡献值-最优解
- UVA 1450 Airport (二分)PS:两种思路的改错,想AC就看我!!!
- uva12166 遍历带括号的二叉树类型
- UVa 12166 - Equilibrium Mobile(二叉树+递归处理括号匹配+模板)
- uva12166 - Equilibrium Mobile
- uva 101 - The Blocks Problem 练习代码控制能力的题目吧 ,思路转化为代码,实现自己的比较复杂的想法
- UVa 10570 Meeting with Aliens(思路)
- uva 12166 bfs
- UVa 12166 - Equilibrium Mobile
- Uva - 12166 - Equilibrium Mobile
- UVA - 1335(Beijing Guards 思路题目)
- [Solver] UVa 11732 strcmp() 的思路
- Uva 11093 Just Finish it up——思路题
- UVa 1450 Airport (二分+思路)
- 我的第一个:uva12096-解题思路
- UVA12166 修改天平
- UVA-213-Message Decoding 信息编码 基础模拟题 直观的新手思路+详细注释
- UVA10129 Play on Words【思路】
- UVa-12166 Equilibrium Mobile
- UVA - 1609 Foul Play——思路题