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

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. 1 let和const

    let命令 1)let声明的变量只在let命令所在的代码块内有效,如:   { let a = ; ;} a // ReferenceError: a is not defined. b 对于for循 ...

  2. jquery判断数据类型和相同字符串不相等

    typeof object返回object对象数据类型 encodeURIComponent(str)//可把字符串作为URI 组件进行编码. 若str1和str2字符串数值相同,encodeURIC ...

  3. json_encode详解

    <?php $json = Array ( "a" => "php" , "b" => "mysql" ...

  4. PHP 运行 php-fpm 报错

      报错如下: [27-Aug-2017 18:34:23] WARNING: Nothing matches the include pattern '/usr/local/php/etc/php- ...

  5. sqlserver数据库使用技巧(一)--限制数据库的大小

    如何限制数据库的大小? 随着数据库的使用,他占用的空间会越来越大,为了便于资源的合理分配和管理,我们可以限制其最大的大小,这个建议只在测试环境使用 具体操作如下: 打开sqlserver数据库管理工具 ...

  6. nginx加权轮询和ip_hash

    nginx为后端web服务器(apache,nginx,tomcat,weblogic)等做反向代理 几台后端web服务器需要考虑文件共享,数据库共享,session共享问题.文件共享可以使用nfs, ...

  7. 将本地目录上传值git仓库

    创建git仓库 以github为例,登录账号建立一个仓库,然后将仓库地址copy下来. 本地目录 初始化 $ git init 添加至版本库 $ git add -A 提交 $ git commit ...

  8. 安装nginx-1.5.2

    新建用户及用户组groupadd webuseruseradd -g webuser webuser 下载nginx-1.5.2 下载地址:http://pan.baidu.com/s/1gd1khc ...

  9. 一次saltstack环境变量的坑

    现场环境: salt-minion端: ip:10.0.3.149     环境:使用 nvm装的nodejs    受用nodejs自带的npm 安装pm2 sal-master端: IP:10.0 ...

  10. BZOJ 1426: 收集邮票 [DP 期望 平方]

    传送门 题意: 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮 ...