Uva 12166 该死的天平又不平衡了

一、题意

输入kase组数据,每组包括一个字符串,表示一个天平,如 "[[3,7],6]"
要求输出一个数,表示最少需要修改多少个数字使得天平平衡。

二、解析

逻辑思维题。实际上整个天平中,任意一个数字都能决定整个天平的所有数字(因为要使得天平平衡),这样一来,就可以计算所有叶子结点所最终确定出的平衡天平总重量,统计每一种重量的数量,数量中最大的那一个所对应的叶子节点就是我们不要变的,这样只需要修改剩下的叶子即可。

三、代码

#include <iostream>
#include <string>
#include <sstream>
#include <map>
#include <cctype>
#include <cmath>
using namespace std;
using LL = long long;
int kase, leafNum;
map<LL, int> cnt;

void solve(string str, int depth) {
    int in = 0, pos = -1;
    for(int i = 0; i < str.size(); i ++){
        char ch = str[i];
        if(ch == '[') in ++;
        else if(ch == ']') in --;
        else if(ch == ',' && in == 1) {
            pos = i;
            break;
        }
    }
    if(pos == -1) {
        int val = stoi(str);
        cnt[val * pow(2, depth)] ++;
        leafNum ++;
    }
    else {
        solve(str.substr(1, pos - 1), depth + 1);
        solve(str.substr(pos + 1, str.size() - pos - 2), depth + 1);
    }
}

int main() {
    cin >> kase;
    while(kase --) {
        leafNum = 0, cnt.clear();
        string str;
        cin >> str;
        solve(str, 0);
        int max_cnt = 0;
        for(auto p : cnt) max_cnt = max(max_cnt, p.second);
        cout << leafNum - max_cnt << endl;
    }
}

四、归纳

  • 逻辑思维题。想不到就很难,想到了的话编码还是挺快的。

第二次做还是没想到.....我是不是没救了 orz

Re:从零开始的刷题生活 文章被收录于专栏

一起来重刷题叭~ 由于精力有限,题意只说大概,题目细节可以点击vjudge链接查看。 题目以紫薯中的Uva例题/习题为主,有时候有些比较经典的算法也会特意从其它OJ上找题,并不一定出现在紫薯上。 噢,紫薯指——《算法竞赛入门经典(第2版)》by 刘汝佳 喜欢的小伙伴点个赞呗?不然我只能认为一直只有我一个人在自娱自乐orz....

全部评论

相关推荐

StephenZ_:我9月份找的第一段实习也是遇到这种骗子公司了,问他后端有多少人和我说7个正职,进去一看只有一个后端剩下的都是产品前端算法(没错甚至还有算法)。还是某制造业中大厂,我离职的时候还阴阳怪气我
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务