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 数组 预处理可以先计算出一棵树的重量,简化计 ...
随机推荐
- 利用bat批量执行脚本文件
1.读取目录文件 利用bat 的for命令读取中的sql文件 for /r %%c in (0*.sql) do echo %%c %%c 相当于变量 in() 中的为循环的范围 此句的作用是显示当前 ...
- PropertyPlaceholderConfigurer的用法(使用spring提供的类读取数据库配置信息.properties)
http://www.cnblogs.com/wanggd/archive/2013/07/04/3172042.html(写的很好)
- C# var
VAR 是3.5新出的一个定义变量的类型其实也就是弱化类型的定义VAR可代替任何类型编译器会根据上下文来判断你到底是想用什么类型的 至于什么情况下用到VAR 我想就是你无法确定自己将用的是什么类型就可 ...
- Linux通配符
* 任意字符 ?任意单个字符 [] 匹配指定 字符范围内的字符 [^] 指定范围之外的单个字符 常规字符集合 [a-z] a到z的所有小写字母 [A-Z] a到z的所有大写字母 [0-9] 0到9的所 ...
- Thinkphp 事物问题
$m=D('YourModel');//或者是M(); $m2=D('YouModel2'); $m->startTrans();//在第一个模型里启用就可以了,或者第二个也行 $result= ...
- ecshop--加载初始化文件
define('IN_ECS', true);require(dirname(__FILE__) . '/../../includes/init.php'); 在开头要加入这两句文件才可以访问数据库以 ...
- wdcp-apache配置错误导致进程淤积进而内存吃紧
内存总是越来越少,虚拟内存使用越来越多 首先确定到底是什么占用了大量的内存 可以看到,大部分内存被闲置的httpd进程占用 且当我重启mysql服务后,内存没有出现明显变化,但是当我重启apache时 ...
- C# ERP开发框架
C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4.0.htm 视频下载: 百度 ...
- python中去掉空行的问题
在python中处理空行时,经常会遇到一些问题.现总结经验如下: 1.遇到的空行如果只有换行符,直接使用=='\n'或者 len(line)==line.count('\n') 2.有多个空格+换行符 ...
- SQL SERVER CEILING 函数 取整时的坑。。。
CEILING ---返回大于或等于指定数值表达式的最小整数 当舍去同一个大小的值 但是正负方向不一致时要注意小数位四舍五入的问题 例如: SELECT CEILING($123.45), CEI ...