您的位置:首页 > 其它

UVa 12166 修改天平

2016-12-27 22:00 453 查看
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3318

题意:给一个深度不超过16的二叉树,代表一个天平。每根杆悬挂在中间,每个秤砣的重量已知,至少修改多少个秤砣的重量才能让天平平衡?

要让天平平衡,必须以其中一个秤砣作为标准,然后修改其余的秤砣。当以深度为d,值为x的叶子节点作为标准时,可以发现此时天平的总质量为x<<d。

因此可以遍历二叉树的每个叶子节点,在这里可以使用map容器,计算出秤砣总质量m所出现的次数,并且记录叶子节点数量number。这样,最后(number-map容器中最大的数)即为修改的最少次数。

一开始我不明白为什么要w*10,直接w<<depth不就行了,后来意识到如果是多位数就需要*10了...

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

int number;
string line;
map<long long, int> ans;

void dfs(int depth, int s, int length)
{
if (line[s] == '[')
{
int p = 0;
for (int i = s + 1; i<length; i++)
{
if (line[i] == '[')  p++;
if (line[i] == ']')  p--;
if (p == 0 && line[i] == ',')
{
dfs(depth + 1, s + 1, i-1);
dfs(depth + 1, i + 1, length - 1);
}
}
}
else {
long long w = 0;
for (int i = s; i <= length; i++)
w = w * 10 + line[i] - '0';
++number;
++ans[w << depth];
}
}

int main()
{
int t;
int maxn;
cin >> t;
while (t--)
{
cin >> line;
ans.clear();
number = 0;
dfs(0, 0, line.size()-1);
maxn = 0;
map<long long, int>::iterator it = ans.begin();
for (; it != ans.end(); it++)
{
maxn = max(maxn, it->second);
}
cout << number - maxn << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: