zoukankan      html  css  js  c++  java
  • Equilibrium Mobile (UVa 12166) dfs二叉树

    题目:

    思路: 方法很巧妙,参考的网上的方法。 任意一点都可以决定整棵树(根结点)的重量,设这个结点重量为 w ,位于第 depth 层,则整棵树的重量为 w<<depth。因此只要统计所有点对应的整棵树的重量所出现的次数,再用点的数量减去重量出现最多的次数即为答案。

    /* Equilibrium Mobile (UVa 12166) */
    #include <iostream>
    #include <cstring>
    #include <map>
    using namespace std;
    
    const int maxn = 1 << 20;
    
    map<long long, int> cnt;
    int sum;
    char s[maxn];
    
    void solve(int begin, int end, int depth);        // dfs 求出每个结点对应的整棵树的重量,并统计
    
    int main(){
        //freopen("input.txt", "r", stdin);
        int T;
        cin >> T;    getchar();
        while(T--){
            cin >> s;
            cnt.clear();
            sum = 0;
            solve(0, strlen(s)-1, 0);
            
            int num = 0;
            for(map<long long, int>::iterator it = cnt.begin(); it != cnt.end(); it++){    //求出每个重量对应的个数的最大值 
                num = max(num, it->second);
            }
            
            cout << sum - num << endl;        //一共有 sum 个点,减去 num 就是要修改的个数 
        }
    } 
    
    void solve(int begin, int end, int depth){
        if(s[begin] == '['){
            int  t = 0;
            for(int i=begin+1; ; i++){
                if(s[i] == '[')    t++;
                if(s[i] == ']') t--;
                if(t==0 && s[i] == ','){
                    solve(begin+1, i-1, depth+1);
                    solve(i+1, end-1, depth+1);
                    break;
                }
            }
        }else{
            long long num = 0;
            for(int i=begin; i<=end; i++){
                num = num*10 + s[i] - '0';
            }
            cnt[num << depth]++;
            sum++;
        }
    }
  • 相关阅读:
    ubuntu 9.04更新源
    想学一下asp.net,跟着书本做了个bbs
    [转]ubuntu系统中遇到的一些问题及解决
    第一篇,打个招呼
    人际交往的书籍推荐
    程序员的五层境界,你在哪一层?
    HTTP报文之"请求报文"和"响应报文"详解
    如何提高你的工作效率?
    面对焦虑我们怎么办 ?
    CEO要看的书籍推荐
  • 原文地址:https://www.cnblogs.com/lighter-blog/p/6048264.html
Copyright © 2011-2022 走看看