uva12166 修改天平

这道题的特点在于,我们不管确定哪一个点的位置,所有其他位置的权值是一定的,所以我们秩序按照一个深度标准换算所有点的值,相同的最多值就是需要修改最少的方案,具体代码可以直接用map来维护。

#include<bits/stdc++.h>
using namespace std;
string s;
map<long long,int>Q;//因为如果任何一个节点的值确定,其他所有值都会确定,所以我们按深度给不同节点不同值换算到同一维度,然后在比较那个值出现次数最多就可以统计出需要修改的最小次数 
int sum;
void DFS(int depth,int s1,int e1)  //深度,遍历起点与终点 
{
    if(s[s1]=='[')
    {
        int p=0;
        for(int i=s1+1;i!=e1;i++)
        {
            if(s[i]=='[') p++;
            if(s[i]==']') p--;
            if(s[i]==','&&p==0)   //每遇到一个根都会做相应的dfs处理 
            {
                DFS(depth+1,s1+1,i-1);
                DFS(depth+1,i+1,e1-1);
            }
        }
    }
    else
    {
        long long w=0;
        for(int i=s1;i<=e1;i++)  w=w*10+s[i]-'0'; //读取连续数字 
        sum++;       
        Q[w<<depth]++;       //映射的值会加一 
    }
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>s;
        sum=0;
        Q.clear();
        DFS(0,0,s.length()-1);
        int maxsum=0;
        for(auto it=Q.begin();it!=Q.end();it++) 
        {
            if(it->second>maxsum) 
                maxsum=it->second;
        }
        int ans=sum-maxsum;     
        cout<<ans<<endl;
    }
    return 0;
}

 

posted @ 2020-10-05 14:15  徒手拆机甲  阅读(167)  评论(0)    收藏  举报