题目:
思路: 方法很巧妙,参考的网上的方法。 任意一点都可以决定整棵树(根结点)的重量,设这个结点重量为 w ,位于第 depth 层,则整棵树的重量为 w<<depth。因此只要统计所有点对应的整棵树的重量所出现的次数,再用点的数量减去重量出现最多的次数即为答案。
/* Equilibrium Mobile (UVa 12166) */ #include <iostream> #include <cstring> #include <map> using namespace std; const int maxn = 1 << 20; map<long long, int> cnt; int sum; char s[maxn]; void solve(int begin, int end, int depth); // dfs 求出每个结点对应的整棵树的重量,并统计 int main(){ //freopen("input.txt", "r", stdin); int T; cin >> T; getchar(); while(T--){ cin >> s; cnt.clear(); sum = 0; solve(0, strlen(s)-1, 0); int num = 0; for(map<long long, int>::iterator it = cnt.begin(); it != cnt.end(); it++){ //求出每个重量对应的个数的最大值 num = max(num, it->second); } cout << sum - num << endl; //一共有 sum 个点,减去 num 就是要修改的个数 } } void solve(int begin, int end, int depth){ if(s[begin] == '['){ int t = 0; for(int i=begin+1; ; i++){ if(s[i] == '[') t++; if(s[i] == ']') t--; if(t==0 && s[i] == ','){ solve(begin+1, i-1, depth+1); solve(i+1, end-1, depth+1); break; } } }else{ long long num = 0; for(int i=begin; i<=end; i++){ num = num*10 + s[i] - '0'; } cnt[num << depth]++; sum++; } }