这题思维难度很大,关键是总结这个性质。

1.天平性质:某个秤砣重量为w,高度为h,如果要让这个天平平衡并且以这个秤砣为基准,那么整个天平的总重量为w*(2^h)

2.利用这个性质:题目要求秤砣数量改变最少,就是说尽量多的不改变秤砣重量,把总质量作为主键,统计总质量相同的秤砣个数,

最后计算出数量最多的,就是不用改变质量的最大秤砣数量,用所有秤砣数减去不用改变质量的最大秤砣数量就是答案。

3.当然,用这个性质,会让某些秤砣的质量变为小数。

4.注意,总重量可能会变成long long类型。

AC代码:

#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
#define max(x,y) (x) > (y) ? (x) : (y)
typedef long long LL;
const int maxn = 1e6 + 5;
char str[maxn];

map<LL, int>ha;
int node; //numbers of node

void dfs(int l, int r, int h){
    if(str[l] == '[') {
        int p = 0;
        for(int i = l + 1; i < r ; ++i){
            if(str[i] == '[') ++p;
            else if(str[i] == ']') --p;
            else if(str[i] == ',' && p == 0) {
                dfs(l + 1, i - 1, h + 1); //Left
                dfs(i + 1, r - 1, h + 1); //Right
            }
        }
    }
    else {
        ++node;
        int num = 0;
        while(l <= r) num = num * 10 + str[l++] - '0';
        ha[(LL)num << h]++;
    }
}

int main(){
    int T;
    scanf("%d", &T);
    while(T--) {
        node = 0;
        scanf("%s", str);
        int n = strlen(str);
        dfs(0, n-1, 0);
        int ans = 0;
        for(map<LL, int>::iterator c = ha.begin(); c != ha.end(); ++c) {
            ans = max(ans, c->second);
        }
        printf("%d\n",node - ans);
        ha.clear();
    }
    return 0;
}

如有不当之处欢迎指出!

UVA-12166 天平性质+字符处理的更多相关文章

  1. UVa 12166 修改天平

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

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

    题意:问使天平平衡需要改动的最少的叶子结点重量的个数. 分析:天平达到平衡总会有个重量,这个重量可以由某个叶子结点的重量和深度直接决定. 如下例子: 假设根结点深度为0,结点6深度为1,若以该结点为基 ...

  3. UVa 1354 天平难题

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVa 839 天平

    原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  5. UVA 12166 Equilibrium Mobile

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

  6. UVa 1354 天平难题 (枚举二叉树)

    题意: 分析: 其实刚看到这题的时候觉得很难, 以至于结束了第七章然后去做了一遍第六章树的部分.现在再做这题觉得思路并不是太难,因为总共就只有六个结点,那么只要枚举二叉树然后算出天平然后再从叶子往上推 ...

  7. Uva 839天平(二叉树dfs, 递归建树)

    题意: 给定一个天平长度 输入格式为 wl dl wr dr 分别代表天平左边长度,左边重量, 右边长度, 右边重量. 如果重量为0, 说明下面还有一个天平, 递归给出. 样例输入:10 2 0 40 ...

  8. UVa 1354 天平难题 Mobile Computing

    整个题考虑起来 最主要要计算的状态 是树的状态 于是要计算出所有可能挂坠可能组成的树的所有形态 tree 用于保存这些状态 考虑不要重复计算,有一个vis 数组 预处理可以先计算出一棵树的重量,简化计 ...

  9. UVA 12166 Equilibrium Mobile(贪心,反演)

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

随机推荐

  1. editplus和ultraedit(UE)的使用

    本来呢我是没有打算写关于editplus和ue的文章的,但是最近我花了12K买了一台电脑,在折腾电脑的时候就重新设置了好多经常用到的工具,以前我使用比较多的是editplus,但是使用这个editpl ...

  2. 安卓studio导入jra包和so包,百度地图so包加载

    导入so包 这个我只接受测试可用的一种方法 第一步:把so包放在libs目录下,可以是文件夹也可以是单独的一个个so文件 然后在src同级的目录下找到build.gradle文件下如下信息 sourc ...

  3. android之间传递list

    Intent intent = new Intent(getActivity(), Activity_Character.class); intent.putExtra("mlTrait&q ...

  4. Python爬虫进阶(Scrapy框架爬虫)

    准备工作:           配置环境问题什么的我昨天已经写了,那么今天直接安装三个库                        首先第一步:                           ...

  5. all,any函数

    all函数:当矩阵全为非零元素时返回1,否则(存在零元素),返回0: any函数:当矩阵中存在非零      1     1     1     1      1     1     1     1 ...

  6. 【转】sed正则表达式

    1 正则表达式简介 正则表达式(Regular Expression) 是一种描述文本(或字符串)模式的工具.正则表达式常用于查找文本的场合.想想一下我们日常生活中的例子,假如你想从电话本里找一个联系 ...

  7. LINUX获取文件信息

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  8. Java细节

    native关键字用法 native是与C++联合开发的时候用的!java自己开发不用的! 使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL, ...

  9. Bom部分

    Bom部分  browser object model(浏览器对象模型)将浏览器中的各个组件封装成对象,我们可以使用这些对象来操作浏览器的一些动作.封装的规则基于ECMAScriptBom的组成--— ...

  10. 百度插件webuploader的坑!

    前言: 自因为项目中需要使用上传插件,所以之前找了几款上传插件.但是呢,小的上传插件是不支持我们项目上传的(做虚拟机项目的,一个镜像可能好几个G),所以呢这个插件要支持分片上传,拓展性要高(肯定的啦, ...