您的位置:首页 > 产品设计 > UI/UE

天平&二叉树--uva12166 Equilibrium Mobile

2017-07-26 20:11 423 查看
用字符串形式给定一个天平,求出最少修改几个秤砣的质量,能使天平平衡。

别人非常非常非常神奇的题解!

1.秤砣都位于二叉树的叶子结点,即修改叶子结点使得天平平衡

2.至少有一个叶子结点不修改。

那么对于某个叶子结点,如果它不修改,其他所有结点参考它来平衡,它质量为w,深度为d,那么平衡后整个天平质量为w << d

3.对每个叶子结点为参考点的情况计算天平质量sumw,那可能有一些叶子结点计算出的sumw相同,那么就是当天平平衡后的质量要是为sumw,那么这些点都不用改。

用map计数求max,sum - max即所求。

#include <iostream>

#include <string>

#include <algorithm>

#include <map>

using namespace
std;

string s;

map<long
long,int>mp;

int solve()

{

    int dep =
0,cnt = 0;

    for (int i =
0; i < s.size(); i ++) {

        if (s[i] ==
'[')  dep ++;

        if (s[i] ==
']')  dep --;

        if (isdigit(s[i]))
{

            int num =
s[i] -
'0',base = 10;

            while (isdigit(s[i
+ 1])) {

                i ++;

                num = num * base + s[i] -
'0';

            }

            mp[(long
long)num <<
dep] ++;

            cnt ++;

        }

    }

    return cnt;

}

int main()

{

    int T;

    cin >> T;

    while (T --) {

        cin >>
s;mp.clear();

        int sum =
solve();

        int m =
0;

        for(auto a:mp) m =
max(m,a.second);

        cout << sum - m <<
endl;

    }

    return
0;

}
递归不大会,就偷懒直接用[]计算叶子深度了,想抱住自己亲一口~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: