首页 > 其他 > 详细

uva12166 修改天平

时间:2020-10-05 14:35:51      阅读:14      评论:0      收藏:0      [点我收藏+]

这道题的特点在于,我们不管确定哪一个点的位置,所有其他位置的权值是一定的,所以我们秩序按照一个深度标准换算所有点的值,相同的最多值就是需要修改最少的方案,具体代码可以直接用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;
}

 

uva12166 修改天平

原文:https://www.cnblogs.com/tscjj/p/13769885.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!