修改天平——UVa 12166
修改天平(Equilibrium Mobile, NWERC 2008, UVa12166)#
给一个深度不超过16的二叉树,代表一个天平。每根杆都悬挂在中间,每个秤砣的重量
已知。至少修改多少个秤砣的重量才能让天平平衡?如图6-23所示,把7改成3即可。
输入#
示例第一行为整数n,它代表有多少组测试示例。
以下的n行每一行是一组单独的测试示例。每组测试实例是一个表达式,表示天平所代表的二叉树。
表达式的语法规则如下
< expr >::=< weight >| "["< expr >","< expr >"]"
如上图对应的测试示例是:[[3,7],6]
输出#
对于每组测试示例,输出使天平平衡,最小要修改的砝码数。
测试示例#
Sample Input
3
[[3,7],6]
40
[[2,3],[4,5]]
Sample Output
1
0
3
思路#
搞了一下午,没啥思路。输入都处理不好。
所以这题挺好的,对于只有叶子节点有值的那种树,提供了一个输入的模板,还有对于解决这种题目提供了一个有意思的思路。据说这个思路在竞赛中挺常用的。
基本思路就是,我们既然要修改一个砝码使天平平衡,那肯定就要有一个砝码是参考砝码,然后按照它来改。对于一个砝码,如果指定它是参考砝码了,那整个天平的总重量就能确定了,就是。depth
是这个砝码当前在树中的深度。
还是看这个图
如果使用3作为参考砝码,那么整个天平的重量是,需要修改砝码7为3。
如果使用7作为参考砝码,那么整个天平的重量是,需要修改砝码3为7,6为14。
如果使用6作为参考砝码,那么整个天平的重量是,需要修改砝码7为3。
我们发现三次参考砝码的选择中,有两次得到的天平总重量都是12,也就是说,这两个砝码如果修改其中一个,另一个就不用改。那么我们把使用每一个砝码得到的天平总重记录起来,找到其中出现次数最多的那个,然后我们用砝码数减去它就是最少修改砝码数了。
代码#
#include "iostream"
#include "cstdio"
#include "cstring"
#include "map"
#define LL long long
using namespace std;
char line[1500000];
map<LL, int> ID;
int sum;
void dfs(int l,int r,int d) {
if (line[l] == '[') {
int level=0;
for (int i = l+1; i <= r; i++) {
if (line[i] == '[') level++;
else if (line[i] == ']') level--;
if (level == 0 && line[i] == ',') {
dfs(l + 1, i - 1, d + 1);
dfs(i + 1, r-1, d + 1);
}
}
}
else {
int w;
sscanf(line+l,"%d", &w);
ID[(LL)w * (1 << d)]++;
sum++;
}
}
int main() {
int n;
scanf("%d", &n);
getchar();
for(int i=0;i<n;i++){
ID.clear(); sum = 0;
scanf("%s", line);
dfs(0,strlen(line)-1,0);
map<LL, int>::iterator it;
int max=0;
for (it = ID.begin(); it != ID.end(); it++)
max = it->second > max ? it->second : max;
printf("%d\n", sum - max);
}
return 0;
}
参考#
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/14006514.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)