UVA 12166 Equilibrium Mobile (二叉树遍历+贪心)

来源:互联网 发布:maven 打包java环境 编辑:程序博客网 时间:2024/06/05 06:58

题意:题目给一棵二叉树,每个点都有一个对应的权值,对初始的二叉树进行操作,使得修改后的整棵二叉树整体平衡,那么普通的想法枚举每一个点再去确定修改的点数是不现实的,那么考虑一下二叉树的性质,发现如果二叉树某一个结点的权值确定了的话,那么整棵树的整体权值是确定的,深度为deep的单点权值x对应的整体权值为x*2^deep,那么遍历整棵树,对每一个点进行计算整体权值,那么对应某一个整体权值要修改的点个数为总结点数减去某个整体权值,在遍历过程用map记录一下,最后遍历一遍即可

代码如下:

#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<iostream>using namespace std;typedef long long ll;char str[10000000];//string str;map<ll,int> base;int sum;void dfs(int deep,int l,int r){    if(str[l]=='[')    {        int t=0;        for(int i=l+1;i<=r;i++)        {            if(str[i]=='[') t++;            else if(str[i]==']') t--;            if(!t&&str[i]==',')            {                dfs(deep+1,l+1,i-1);                dfs(deep+1,i+1,r-1);            }        }    }    else    {        ll w=0;        for(int i=l;i<=r;i++) w=w*10+str[i]-'0';        sum++;        base[w<<deep]++;    }}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%s",str);        base.clear();        sum=0;        dfs(0,0,strlen(str)-1);        int maxx=0;        for(map<ll,int>::iterator it=base.begin();it!=base.end();it++) maxx=max(it->second,maxx);        printf("%d\n",sum-maxx);    }}


原创粉丝点击