一开始没有思路,后来看了看网上的,发现这个题的玄机就在于 如果一个磅砣给定了,那么这个天平两端总重量也就给定了(这个重量就是 当前磅砣重量<<当前深度)。最坏情况是把所有的磅砣都改掉,那么简化情况就是有一个或一个以上固定,可以根据这个固定的情况,推断出其他的情况。
于是就开出一个map<long long int, int> change 来记录 如果总重量是 A,那么有几个可以固定下来,最后找出一个最大值,磅砣总数减去这个最大值就是答案了。
虽然这个题说是二叉树,但其实根本不用dfs(网上好多用了的),我用一个stack来维护,碰到 [ 深度就加一,碰到 ] 深度就减一 ,这样做就行了。
具体参加代码吧~~
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stack>
#include<map>
#include<vector>
using namespace std;
char input[500000]={0};
map<long long int , int> change;
int main()
{
int n;
cin>>n;
while(n--)
{
memset(input,0,sizeof(input));
change.clear();
cin>>input;
int length=strlen(input);
int i=0;
int depth=0;
int nn=0;
while(true)
{
if(i>=length) break;
if(input[i]=='[')
{
depth++;
i++;
continue;
}
if(input[i]==']')
{
depth--;
i++;
continue;
}
if(input[i]==',')
{
i++;
continue;
}
if(input[i]>='0' && input[i]<='9')
{
long long int number=input[i]-'0';
i++;
while(input[i]>='0' && input[i]<='9')
{
number=number*10+input[i]-'0';
i++;
}
change[number<<depth]++;
nn++;
}
}
map<long long int,int>::iterator iter;
int maxn=0;
for(iter=change.begin();iter!=change.end();iter++)
{
maxn=max(maxn,iter->second);
}
cout<<nn-maxn<<endl;
}
return 0;
}