Mobile Computing-天平难题-Uva1354(回溯枚举二叉树)
原题:https://uva.onlinejudge.org/external/13/1354.pdf
有s块石头,每块都被一根绳子吊着,如果有两个及以上的石头,需要平衡的天平把所有的石头挂起来。
房间的宽度为r,问小于房间宽度r的天平的最大宽度。
分析: 是个回溯枚举的问题,枚举中途如果发现当前宽度已经大于r,回溯。
难点: 也可以说是亮点,就是枚举所有的二叉树,一个天平可以看成是一个二叉树。
具体点说递归建立二叉树的过程就是每次从包含所有节点的集合中选择两个节点,合二为一
所以我们建树的过程是先确定叶子节点,再合并生成父节点。
因为我们建立的二叉树的特点就是所有叶子节点是我们要挂的石头,所有父节点都是一个天平
细节:这题有个特别坑的细节,卡了我wa好久,就是二叉树的右节点可能会和左节点重叠
并且有可能右节点的左杠杆长度大于左节点的做杠杆长度,反之亦然。
上图

所以在生成父节点计算左右天平总长度的时候需要考虑上述特殊情况
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = ;
int n, idx, f[MAXN], w[MAXN];
double r, ans, rw[MAXN], lw[MAXN]; void build_binary_tree(int dep) {
if (dep == n) return;
for (int i = ; i < MAXN; i++) if (f[i])
for (int j = ; j < MAXN; j++) if (i != j && f[j]) {
double L = max(lw[i], lw[j] - ), R = max(rw[i] - , rw[j]);
if ( + L + R < r) {
if (dep == n - ) ans = max( + L + R, ans);
f[i] = f[j] = ;
int id = idx++;
f[id] = ;
w[id] = w[i] + w[j];
lw[id] = w[j] * 1.0 / w[id] + L;
rw[id] = w[i] * 1.0 / w[id] + R;
build_binary_tree(dep + );
f[--idx] = ;
f[i] = f[j] = ;
}
}
} int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%lf%d", &r, &n);
ans = -; idx = ;
memset(f, , sizeof(f));
memset(rw, 0.0, sizeof(rw));
memset(lw, 0.0, sizeof(lw));
for (int i = ; i < n; i++) {
scanf("%d", &w[i]);
f[idx++] = ;
}
if (n == ) {printf("0.0000000000\n"); continue;}
build_binary_tree();
printf("%.10lf\n", ans);
}
return ;
}
Mobile Computing-天平难题-Uva1354(回溯枚举二叉树)的更多相关文章
- uva1354 天平难题 【位枚举子集】||【huffman树】
题目链接:https://vjudge.net/contest/210334#problem/G 转载于:https://blog.csdn.net/todobe/article/details/54 ...
- UVa 1354 天平难题 (枚举二叉树)
题意: 分析: 其实刚看到这题的时候觉得很难, 以至于结束了第七章然后去做了一遍第六章树的部分.现在再做这题觉得思路并不是太难,因为总共就只有六个结点,那么只要枚举二叉树然后算出天平然后再从叶子往上推 ...
- uva1354 枚举二叉树
这题很难,这几天一直在想这题,最后看了汝佳大哥的代码才明白.贴上代码 // UVa1354 Mobile Computing // Rujia Liu #include<cstdio> # ...
- UVa 1354 Mobile Computing[暴力枚举]
**1354 Mobile Computing** There is a mysterious planet called Yaen, whose space is 2-dimensional. Th ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- Uva 1354 Mobile Computing
题目链接 题意: 在一个宽为r 的房间里, 有s个砝码, 每个天平的一端要么挂砝码, 要么挂另一个天平, 并且每个天平要保持平衡. 求使得所有砝码都放在天平上, 且总宽度不超过房间宽度的最大值. 思路 ...
- UVa 1354 天平难题
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Mobile Computing: the Next Decade论文 cloudlet薄云
1 Introduction “Information at your fingertips anywhere, anytime” has been the driving vision of mob ...
- UVa 1354 天平难题 Mobile Computing
整个题考虑起来 最主要要计算的状态 是树的状态 于是要计算出所有可能挂坠可能组成的树的所有形态 tree 用于保存这些状态 考虑不要重复计算,有一个vis 数组 预处理可以先计算出一棵树的重量,简化计 ...
随机推荐
- LENGTH和LENGTHB函数,substrb截取也是同一个道理。
oracle 利用 LENGTH和LENGTHB函数区分中英文(2009-02-07 10:49:29) 转载▼ 标签: it 分类: oracle 前一段时间,我一朋友问我怎么得出这个字符串是中文还 ...
- SQL语句之三简单增删改查
这是前面建的库和表 USE Test go INSERT dbo.MyTable --插入数据 ( NAME ,age) VALUES ( '数据,20 -- NAME - var ...
- godaddy_关于产品退款
You're chatting with Danny.Danny - Thank you for contacting live chat. My name is Danny. How can I a ...
- sqlserver触发器如何将一个库中的数据插入到另外一个库中
需求:实现的功能就是,查询当前表的所有信息,插入到另外一个库中(同一台机器,同一个SqlServer) 解决:insert into dB2.dbo.TB2 select * from db1.dbo ...
- Asp.Net 注册 邮箱激活
数据库 表的设计 State为用户状态 0为禁用 1为可用 默认为0,下面有个UserGUID,这个字段将来用于激活账户 首先你要写一个表单,验证码神马的,这个我就不写了..直接写处理的 代码在 ...
- (一)Nodejs - 框架类库 - Nodejs异步流程控制Async
简介 Async是一个流程控制工具包,提供了直接而强大的异步功能 应用场景 业务流程逻辑复杂,适应异步编程,减少回调的嵌套 安装 npm insatll async 函数介绍 Collections ...
- 334. Increasing Triplet Subsequence My Submissions Question--Avota
问题描述: Given an unsorted array return whether an increasing subsequence of length 3 exists or not in ...
- Queue学习
Queue在Python中可以算作是一种容器,但是他和list,set,dict不一样. 1. Queue不是Python内置类型.它在Queue模块中定义. 2. 它不是iterator容器,他不能 ...
- 我用Emacs,后来转向Vim——Vim学习之Vim键盘图(绝对值得珍藏)
Emacs本来就比较臃肿,麻烦.当我发现Vim键盘图时,我就渐渐转向Vim,追随Unix/Linux哲学去了.. 我用了Emacs三个月,因为它的学习曲线没Vim陡,这点吸引了,我使用Linux才7. ...
- 在easyui dialog的子页面内如何关闭弹窗
因项目需要在dialog中添加滚动条,所以就在div中加了iframe: <div id="applyRefundDialog" style="display:no ...