您的位置:首页 > 产品设计 > UI/UE

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

2017-02-12 15:29 316 查看
思路:题目要求是求改变的最小,那么就需要选定一个基准砝码,选择方式如下:对于任何一个结点砝码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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: