这题思维难度很大,关键是总结这个性质。
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;
}
如有不当之处欢迎指出!