UVA-12166 Equilibrium Mobile(二叉树)

题目大意:改变二叉树上的权值,使树平衡,问最少该几个值。

题目分析:不会做,查的题解。有条奇妙的性质:如果将第d层权值为w的节点为基准做改动,则整棵树的总重量为w<<d,即w*2^d。仔细一想,确实是这样的。

代码如下:

# include<iostream>
# include<cstdio>
# include<map>
# include<cstring>
# include<algorithm>
using namespace std;

int cnt;
string str;
map<long long,int>mp;

void solve(int l,int r,int d)
{
    if(str[l]==‘[‘){
        int flag=0;
        for(int i=l+1;i<r;++i){
            if(str[i]==‘[‘) ++flag;
            if(str[i]==‘]‘) --flag;
            if(!flag&&str[i]==‘,‘){
                solve(l+1,i-1,d+1);
                solve(i+1,r-1,d+1);
            }
        }
    }else{
        long long w=0;
        for(int i=l;i<=r;++i)
            w=w*10+str[i]-‘0‘;
        ++cnt;
        ++mp[w<<d];
    }
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        mp.clear();
        cnt=0;
        cin>>str;
        solve(0,str.size()-1,0);
        int maxn=0;
        for(map<long long,int>::iterator it=mp.begin();it!=mp.end();++it)
            maxn=max(maxn,it->second);
        printf("%d\n",cnt-maxn);
    }
    return 0;
}

  

时间: 2024-10-13 22:24:08

UVA-12166 Equilibrium Mobile(二叉树)的相关文章

UVA - 12166 Equilibrium Mobile (修改天平)(dfs字符串表示的二叉树)

题意:问使天平平衡需要改动的最少的叶子结点重量的个数. 分析:天平达到平衡总会有个重量,这个重量可以由某个叶子结点的重量和深度直接决定. 如下例子: 假设根结点深度为0,结点6深度为1,若以该结点为基准(该结点值不变),天平要平衡,总重量是12(6 << 1),而若以结点3为基准,天平要平衡,总重量也是12(3 << 2). 由此可得,只需要算出以每个结点为基准的总重量,若该重量下对应的叶子结点最多,则使天平在此重量下平衡改变的叶子结点数最少. #pragma comment(li

UVA 12166 Equilibrium Mobile

直接贪心嘛.先想想最后平衡的时候,如果知道了总重量,那么每一个结点的重量其实也就确定了. 每个结点在左在右其实都不影响,只和层数有关.现在反过来,如果不修改某个结点,那么就可以计算出总质量,取总质量出现次数最多的保持不变. /********************************************************* * --------------Tyrannosaurus--------- * * author AbyssalFish * ***************

UVa 12166(字符型二叉树的dfs)

一.题目 [PDF Link] A mobile is a type of kinetic sculpture constructed to take advantage of the principle of equilibrium. It consists of a number of rods, from which weighted objects or further rods hang. The objects hanging from the rods balance each o

UVa12166 Equilibrium Mobile (二叉树结论)

链接:http://acm.hust.edu.cn/vjudge/problem/24840分析:以二叉树的某个结点的重量为基准(基准的意思是它的重量不改变),要使整颗二叉树重量达到平衡,整棵树的总重量为w<<depth(w为基准重量,depth为结点的深度从0开始算).那么统计出叶子结点的个数,并且算出以每个叶子结点的重量为基准时整棵树的总重量,把每种总重量出现的次数用map存起来,然后反过来想,要使整颗树在某个总重量下达到平衡,根据前面的(w<<depth)的推导,结点的深度和

12166 - Equilibrium Mobile(DFS)

枚举每个点,判断其余深度是否存在点的权值为(1 << (deep1 - deep2)) * x deep1,deep2为2点的深度 写的比较麻烦 #include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 1000005; char str[ma

UVa 12166 修改天平

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3318 题意:给一个深度不超过16的二叉树,代表一个天平.每根杆悬挂在中间,每个秤砣的重量已知,至少修改多少个秤砣的重量才能让天平平衡? 要让天平平衡,必须以其中一个秤砣作为标准,然后修改其余的秤砣.当以深度为d,值为x的叶子节点作为标准时,可以发现此时天平的总质量为x<<d.

Equilibrium Mobile

Problem Description A mobile is a type of kinetic sculpture constructed to take advantage of the principle of equilibrium. It consists of a number of rods, from which weighted objects or further rods hang. The objects hanging from the rods balance ea

UVa 548 Tree【二叉树的递归遍历】

题意:给出一颗点带权的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小. 学习的紫书:先将这一棵二叉树建立出来,然后搜索一次找出这样的叶子结点 虽然紫书的思路很清晰= =可是理解起来好困难啊啊啊啊 后来终于问懂一丢丢了--- 比如说样例: 中序遍历:3 2 1 4 5 7 6 后序遍历:3 1 2 5 6 7 4 首先做第一层: 在后序遍历中的最后一个数为根节点,然后在到中序遍历中找到这个根节点,在这个根节点的左边是左子树,右边是右子树,这样就确定出了左子树和右子树的区间 然后做第

UVa839 Not so Mobile (二叉树的DFS)

链接:http://acm.hust.edu.cn/vjudge/problem/19486分析:二叉树模型的DFS.输入是采用递归方式输入,直接变读边判断就行. 1 #include <cstdio> 2 3 bool solve(int& W) { 4 int W1, D1, W2, D2; 5 scanf("%d%d%d%d", &W1, &D1, &W2, &D2); 6 bool b1 = true, b2 = true;