UVa12166 Equilibrium Mobile修改天平(二叉樹+dfs)
阿新 • • 發佈:2018-11-06
題目大意:給定一個深度不超過16的二叉樹,代表一個天平,問至少修改多少個秤砣,才能使天平平衡。
題目意思很簡單,就是找一個可以使整個天平修改次數最少的點,一個點可以確定整個天平,開始我就用的這個思路,會超時。
方法:利用二叉樹的特性,找出重複最多的點,深度會改變節點值,深度是假如深度是n的話,value=nowvalue<<n,用map儲存,每次加一。尋找出重複最多的,然後用總節點數-重複最多的節點數。dfs遍歷左右兩節點,迴圈遍歷。
程式碼:
#include<iostream> #include <string> #include <string.h> #include <algorithm> #include<map> #include<vector> using namespace std; map<long long, int>mt; string s;int sum=0; void dfs(int depth, int s1, int e1) { if (s[s1] == '[') { int p = 0; for (int i = s1 + 1; i !=e1; ++i) { if (s[i] == '[')++p; if (s[i] == ']')--p; if (p == 0 && s[i] == ',') { dfs(depth + 1, s1 + 1, i - 1); dfs(depth + 1, i + 1, e1 - 1); } } } else { long long w=0; for (int i = s1; i <= e1; ++i) { w = w * 10 + s[i] - '0'; } ++mt[w << depth]; ++sum; } } int main() { int kase = 0; cin >> kase; while (kase-- > 0) { cin >> s; mt.clear(); int maxn = 0; sum = 0; dfs(0, 0, s.length() - 1); for (map<long long, int>::iterator it = mt.begin(); it != mt.end(); ++it) { maxn = max(maxn, (*it).second); } cout << sum - maxn << endl; } //system("pause"); return 0; }