[数据结构] Equilibrium Mobile UVa12166

本文介绍了一种通过调整秤砣质量使二叉树天平平衡的算法。该算法利用二叉树的特性,通过计算各秤砣对应的根节点值来确定最小修改次数,最终实现天平平衡。

题目描述

给一棵深度不超过16的二叉树,代表一个天平。每个天平左右臂等长,树的子叶表示秤砣且其质量已知。求至少修改多少个秤砣的质量可以让整个天平平衡。

题解

如果这个二叉树满足题目中平衡的要求,那么树的每一层的值都相等,且第 Di D i 层的值与第 Di+1 D i + 1 的关系为: Di=2Di+1 D i = 2 ∗ D i + 1

这样可以这样解题。对每一个秤砣根据其所在的层数算出根的值。这样每一个秤砣都对应一个根节点的值,而一个根节点值棵对应多个秤砣。这样对应最多秤砣的情况就是最少修改的情况。最少修改次数就为秤砣总个数 n n 减去某个根值对应最多的秤砣数m.

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

const int INF = 0x3f3f3f3f;

map<long long , int> mp;
int nodecnt = 0;

int CreateTree(){
    mp.clear();
    nodecnt = 0;
    int minch = 0;
    int knt = 0;
    char ch;
    scanf("%c", &ch);
    while(ch != '\n'){
        if(ch == '[') knt++;
        else if(ch == ']') knt--;
        else if(ch == ',') ;
        else{
            nodecnt++;
            long long num = 0;
            while('0'<=ch&&ch<='9'){
                num = (num*10)+(ch-'0');
                scanf("%c", &ch);
            }
            num = (num<<knt);
            if(!mp.count(num)) mp[num] = 0;
            mp[num]++;
            if(mp[num]>minch) minch = mp[num];
            continue;
        }
        if(scanf("%c", &ch) == EOF) break;
    }
    return minch;
}



int main(){
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    int n;
    cin>>n;
    getchar();
    while(n--){
        int a =  CreateTree();
        printf("%d\n", nodecnt - a);
    }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值