zoukankan      html  css  js  c++  java
  • UVA 12166 Equilibrium Mobile

    题意:

      给出数个天平,每个天平的结构都类似于二叉树,只有左右重量都相等时才平衡,求每个天平最少改多少个秤砣,也就是叶子结点可以使得整个天平平衡。天平的深度不超过16。

    分析:

      要使得改动的数量最少,那么就至少有一个秤砣不变,然后以这个秤砣为基准来调整整个天平。天平的结构是二叉树,那么由此我们可以得出,如果以深度为d重量为w的秤砣为基准,那么整个天平的重量就是w * pow(2, d),即w << d。当然,可能会有一些秤砣算出的以各自为基准的天平总重量相同,设天平总重量为sum,那么这些秤砣的数量就表示了如果使天平的总重量为sum,需要使多少个秤砣保持不变。用map<long long,int>a,表示以a[i]为基准需要改动多少个。

    代码:

      

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <map>
    using namespace std;
    map<long long,int>a;
    int sum;
    string line;
    void dfs(int d,int s,int l)
    {
    if(line[s]=='[')
    {
    int p=0;
    for(int i=s+1;i!=l;++i)
    {
    if(line[i]=='[')
    ++p;
    if(line[i]==']')
    --p;
    if(p==0&&line[i]==',')
    {
    dfs(d+1,s+1,i-1);
    dfs(d+1,i+1,l-1);
    }
    }
    }
    else
    {
    long long w=0;
    for(int i=s;i<=l;++i)
    w=w*10+line[i]-'0';
    ++sum,++a[w<<d];
    }
    }
    int main()
    {
    int T;
    cin>>T;
    while(T--)
    {
    cin>>line;
    a.clear();
    sum=0;
    dfs(0,0,line.size()-1);
    int maxn=0;
    map<long long,int>::iterator it;
    for(it=a.begin();it!=a.end();it++)
    maxn=max(maxn,it->second);
    cout<<sum-maxn<<endl;
    }
    }
  • 相关阅读:
    linux常用命令:
    解决css添加padding后元素变长的问题
    Hbase常用命令
    集群部署的三种方式(hadoop集群部署三种方式)
    linux编译安装指定依赖的软件包
    vue使用Element隐藏侧边栏进度条
    css相对于父容器,固定放在底部并撑满
    java中23种设计模式
    adb remount'的作用是什么?在什么情况下有用?
    java常用http请求库
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4890031.html
Copyright © 2011-2022 走看看