题意:给一个天平,它可能不是平衡的,你可以修改砝码的值来使得它平衡,求最小的修改数量。
我一开始也没思路,看了别人的也恍然大悟。我们可以通过天平末端的一个砝码的质量来求出整个天平平衡的重量。
比如上图:知道了A的质量,那么天平的平衡重量为A*2 * 2。知道c的话为C * 2。
我们可以利用每个砝码得到的值来计算出,最多有多少个砝码不用修改。
#include<cstdio>
#include<map>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
map<long long, int> time;
char str[1000000 + 5];//数据真是长啊
int tot;
void dfs(int depth, int s, int e)
{
if(str[s] == '[')
{
int p = 0;
for(int i = s + 1; i < e; i++)
{
if(str[i] == '[') p++;
if(str[i] == ']') p--;
if(p == 0 && str[i] == ',')
{
dfs(depth + 1, s + 1, i - 1);
dfs(depth + 1, i + 1, e - 1);
break;
}
}
}
else
{
long long sum = 0;
for(int i = s; i <= e; i++) sum = sum * 10 + str[i] - '0';
time[sum<<depth]++;
tot++;
}
}
int main()
{
int n;
scanf("%d", &n);
for(int kase = 1; kase <= n; kase++)
{
time.clear();
tot = 0;
scanf("%s", str);
int len = strlen(str);
dfs(0, 0, len - 1);
int maxn = 0;
//printf("%d\n", tot);
for(map<long long, int>:: iterator it = time.begin(); it != time.end(); it++)
maxn = max(it->second, maxn);
printf("%d\n", tot - maxn);
}
return 0;
}