这题思维难度很大,关键是总结这个性质。
1.天平性质:某个秤砣重量为w,高度为h,如果要让这个天平平衡并且以这个秤砣为基准,那么整个天平的总重量为w*(2^h)
2.利用这个性质:题目要求秤砣数量改变最少,就是说尽量多的不改变秤砣重量,把总质量作为主键,统计总质量相同的秤砣个数,
最后计算出数量最多的,就是不用改变质量的最大秤砣数量,用所有秤砣数减去不用改变质量的最大秤砣数量就是答案。
3.当然,用这个性质,会让某些秤砣的质量变为小数。
4.注意,总重量可能会变成long long类型。
AC代码:
#include<cstdio> #include<cstring> #include<map> using namespace std; #define max(x,y) (x) > (y) ? (x) : (y) typedef long long LL; const int maxn = 1e6 + 5; char str[maxn]; map<LL, int>ha; int node; //numbers of node void dfs(int l, int r, int h){ if(str[l] == '[') { int p = 0; for(int i = l + 1; i < r ; ++i){ if(str[i] == '[') ++p; else if(str[i] == ']') --p; else if(str[i] == ',' && p == 0) { dfs(l + 1, i - 1, h + 1); //Left dfs(i + 1, r - 1, h + 1); //Right } } } else { ++node; int num = 0; while(l <= r) num = num * 10 + str[l++] - '0'; ha[(LL)num << h]++; } } int main(){ int T; scanf("%d", &T); while(T--) { node = 0; scanf("%s", str); int n = strlen(str); dfs(0, n-1, 0); int ans = 0; for(map<LL, int>::iterator c = ha.begin(); c != ha.end(); ++c) { ans = max(ans, c->second); } printf("%d\n",node - ans); ha.clear(); } return 0; }
如有不当之处欢迎指出!