UVA 12166 Equilibrium Mobile (天平性质 + DFS)

来源:互联网 发布:王亚林扈华国现状知乎 编辑:程序博客网 时间:2024/05/16 04:47

思路:题目要求是求改变的最小,那么就需要选定一个基准砝码,选择方式如下:对于任何一个结点砝码m来说,如果选定为基准,那么整棵树的总重量为m*2^deepth (m<<deepth),其中deepth为此砝码的深度,deeoth从0开始;用map<long long ,int>映射重量为(m<<deepth)的个数int,个数最多者选定为基准砝码。

DFS 递归思想:将表达式分成两份(通过,)然后分别DFS向下递归求解

#include<iostream>#include<map>#include<cstring>using namespace std;map<long long ,int >map1;int tatal;string str;void dfs(int cur,int len,int deepth){   if(str[cur]=='['){   int temp=0;   for(int i=cur+1;i<len;i++){   if(str[i]=='[')temp++;   else if(str[i]==']')temp--;   else if(str[i]==',' && temp==0){   dfs(cur+1,i-1,deepth+1);   dfs(i+1,len-1,deepth+1);   break;     //找到中间点就退出了    }   }   }   else {   tatal++;   long long  sum=0;  //一定要定义为long long 型,sum<<deepth 可能大于int类型值    while(cur<=len){   sum=sum*10+str[cur]-'0';   cur++;   }   map1[sum<<deepth]++;   }}int main(){int T;    scanf("%d",&T);while(T--){cin>>str;tatal=0;int len=str.length();dfs(0,len-1,0);int max1=0;for(map<long long ,int>::iterator iter=map1.begin();iter!=map1.end();iter++){max1=max(max1,iter->second);}printf("%d\n",tatal-max1);map1.clear();} return 0; } 


1 0
原创粉丝点击