原题: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(回溯枚举二叉树)的更多相关文章

  1. uva1354 天平难题 【位枚举子集】||【huffman树】

    题目链接:https://vjudge.net/contest/210334#problem/G 转载于:https://blog.csdn.net/todobe/article/details/54 ...

  2. UVa 1354 天平难题 (枚举二叉树)

    题意: 分析: 其实刚看到这题的时候觉得很难, 以至于结束了第七章然后去做了一遍第六章树的部分.现在再做这题觉得思路并不是太难,因为总共就只有六个结点,那么只要枚举二叉树然后算出天平然后再从叶子往上推 ...

  3. uva1354 枚举二叉树

    这题很难,这几天一直在想这题,最后看了汝佳大哥的代码才明白.贴上代码 // UVa1354 Mobile Computing // Rujia Liu #include<cstdio> # ...

  4. UVa 1354 Mobile Computing[暴力枚举]

    **1354 Mobile Computing** There is a mysterious planet called Yaen, whose space is 2-dimensional. Th ...

  5. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  6. Uva 1354 Mobile Computing

    题目链接 题意: 在一个宽为r 的房间里, 有s个砝码, 每个天平的一端要么挂砝码, 要么挂另一个天平, 并且每个天平要保持平衡. 求使得所有砝码都放在天平上, 且总宽度不超过房间宽度的最大值. 思路 ...

  7. UVa 1354 天平难题

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. Mobile Computing: the Next Decade论文 cloudlet薄云

    1 Introduction “Information at your fingertips anywhere, anytime” has been the driving vision of mob ...

  9. UVa 1354 天平难题 Mobile Computing

    整个题考虑起来 最主要要计算的状态 是树的状态 于是要计算出所有可能挂坠可能组成的树的所有形态 tree 用于保存这些状态 考虑不要重复计算,有一个vis 数组 预处理可以先计算出一棵树的重量,简化计 ...

随机推荐

  1. angularjs 遇到Error: [$injector:unpr] Unknown provider: tdpicnews-serviceProvider <- tdpicnews-service <- tdpic-controller 错误

    define(['modules/tdpic-module', 'services/news-service', 'utilities/cryto'], function (app) { 'use s ...

  2. 数据库连接报错之IO异常(The Network Adapter could not establish the connection)

    Io 异常: The Network Adapter could not establish the connection 有以下四个原因: 1.oracle配置 listener.ora 和tnsn ...

  3. 那些常用的eclipse快捷键

    用了很久的eclipse了,有些快捷键常用,有的偶尔使用,现在记下常用的快捷键,以便大家和自己查用(持续更新) 这些快捷键都可以在[window]-[preferences]-[general]-[k ...

  4. 最简单的基于FFmpeg的移动端例子:IOS 视频解码器-保存

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  5. javascript——面向对象程序设计(3)

    <script type="text/javascript"> //1.结合使用构造函数模式和原型模式 //2.动态原型模式 //3.寄生构造函数模式 //4.稳妥构造 ...

  6. splice从数组中删除指定定数据

    /*从数组中删除指定定数据var somearray = ["mon", "tue", "wed", "thur"]so ...

  7. CSS实现图片在div a标签中水平垂直居中

    CSS实现图片在div a标签中水平垂直居中 <div class="demo"> <a href="#"> <img src=& ...

  8. 干掉Google字体,WordPress速度暴涨

    2014年7月7日23:40:31 因为Google被墙,WordPress引用的Google字体总会加载很长时间,严重影响打开速度. 安装WordPress插件 Disable Google Fon ...

  9. PHP面向对象(OOP):克隆对象__clone()方法

    有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象, ...

  10. html5系列.基础知识

    兼容性问题 创建一个html5页面 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...