UVA 12166 Equilibrium Mobile(贪心,反演)

直接贪心。先想想最后平衡的时候,如果知道了总重量,那么每一个结点的重量其实也就确定了。

每个结点在左在右其实都不影响,只和层数有关。现在反过来,如果不修改某个结点,那么就可以计算出总质量,取总质量出现次数最多的保持不变。

/*********************************************************
*      --------------Tyrannosaurus---------              *
*   author AbyssalFish                                   *
**********************************************************/
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int maxd = 16, LEN = (1<<15)*12 + 10;
char s[LEN];

map<ll,int> cnt;

//#define LOCAL
int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    int T; scanf("%d",&T);
    while(T--){
        scanf("%s",s);
        char *p = s;
        int d = 0;
        cnt.clear();
        while(*p){
            if(isdigit(*p)){
                ll x = *p-'0';
                while(isdigit(*(++p))) x = x*10+*p-'0';
                cnt[x<<d]++;
                if(*p == ']') d--;
                if(!*p) break;
            }
            else if(*p == '[') d++;
            p++;
        }
        int sum = 0, M = 0;
        for(auto pr: cnt){
            sum += pr.second;
            M = max(M,pr.second);
        }
        printf("%d\n", sum-M);
    }
    return 0;
}

 

posted @ 2015-11-11 23:40  陈瑞宇  阅读(359)  评论(0编辑  收藏  举报