题意:

分析:

其实刚看到这题的时候觉得很难, 以至于结束了第七章然后去做了一遍第六章树的部分。现在再做这题觉得思路并不是太难,因为总共就只有六个结点,那么只要枚举二叉树然后算出天平然后再从叶子往上推就能得出这棵树的宽度。这题我觉得主要难点是如何去枚举二叉树,其实这就是回溯法的核心。先去dfs选这个作为结点的, 然后还原, 再做不选的dfs, 这样就能没有遗漏(但会有重复)地枚举二叉树了。

这题还有个细节是一个天平中,左子树的右长度可能会超过天平右臂 + 右子树的长度, 如下图

那么就不能单纯地看右臂+右子树的长度了, 要取一个最大值作为这个天平的最右, 反过来的左边也是一样的。

 #include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
struct Tree{
double L, R;
Tree(int _L = , int _R = ):L(_L), R(_R){}
};
Tree tree[<<];
int w[<<], vis[<<]; int n, ind;
double room, maxw; int dfs(int dep){
if(dep == n - ){// 递归边界
if(tree[ind].L + tree[ind].R <= room)
maxw = max(maxw, tree[ind].L + tree[ind].R);
}
for(int i = ; i <= ind; i++){
if(!vis[i]){
for(int j = ; j <= ind; j++){
if(i != j && !vis[j]){ vis[i] = vis[j] = ;//建树
w[++ind] = w[i] + w[j]; int wl = w[i], wr = w[j];
// a | b
// ----------
// | |
// wl wr double a = (double)wr/(wl + wr);
double b = 1.0 - a; tree[ind].R = max(b + tree[j].R, tree[i].R - a);//比较着取最大值,
tree[ind].L = max(a + tree[i].L, tree[j].L - b); dfs(dep + ); vis[i] = vis[j] = vis[ind] = ;//还原
tree[ind].R = tree[ind].L = ;
--ind;
}
}
}
}
}
int main(){
int T;
scanf("%d", &T);
while(T--){
memset(tree,,sizeof(tree));
ind = ;//秤砣数组下标
scanf("%lf", &room);
scanf("%d", &n);
for(int i = ; i <= n;i++){
scanf("%d", &w[i]);
ind++;
}
maxw = -;
memset(vis,,sizeof(vis));
dfs();
if(maxw == -)
printf("-1\n");
else
printf("%.16f\n", maxw);
}
return ;
}

UVa 1354 天平难题 (枚举二叉树)的更多相关文章

  1. UVa 1354 天平难题

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

  2. UVa 1354 天平难题 Mobile Computing

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

  3. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  4. Uva 1354 Mobile Computing

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

  5. UVA.839 Not so Mobile ( 二叉树 DFS)

    UVA.839 Not so Mobile ( 二叉树 DFS) 题意分析 给出一份天平,判断天平是否平衡. 一开始使用的是保存每个节点,节点存储着两边的质量和距离,但是一直是Runtime erro ...

  6. UVA.699 The Falling Leaves (二叉树 思维题)

    UVA.699 The Falling Leaves (二叉树 思维题) 题意分析 理解题意花了好半天,其实就是求建完树后再一条竖线上的所有节点的权值之和,如果按照普通的建树然后在计算的方法,是不方便 ...

  7. UVA.679 Dropping Balls (二叉树 思维题)

    UVA.679 Dropping Balls (二叉树 思维题) 题意分析 给出深度为D的完全二叉树,按照以下规则,求第I个小球下落在那个叶子节点. 1. 默认所有节点的开关均处于关闭状态. 2. 若 ...

  8. Mobile Computing-天平难题-Uva1354(回溯枚举二叉树)

    原题:https://uva.onlinejudge.org/external/13/1354.pdf 有s块石头,每块都被一根绳子吊着,如果有两个及以上的石头,需要平衡的天平把所有的石头挂起来. 房 ...

  9. UVa 1354 Mobile Computing | GOJ 1320 不加修饰的天平问题 (例题 7-7)

    传送门1(UVa): https://uva.onlinejudge.org/external/13/1354.pdf 传送门2(GOJ): http://acm.gdufe.edu.cn/Probl ...

随机推荐

  1. 力荐!35 个最好用的 Vue 开源库!

    无论是开发新手还是经验丰富的老手,我们都喜欢开源软件包.对于开发者来说,如果没有这些开源软件包,很难想象我们的生活会变得多么疲惫不堪,而且靠咖啡度日也会成为家常便饭.所幸的是,随着 Vue.js 和 ...

  2. [Usaco2015 Feb]Censoring

    Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...

  3. AtCoder Grand Contest 003 F - Fraction of Fractal

    题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...

  4. Distance in Tree CodeForces - 161D

    Distance in Tree CodeForces - 161D 题意:给一棵n个结点的树,任意两点之间的距离为1,现在有点u.v,且u与v的最短距离为k,求这样的点对(u,v)的个数((u,v) ...

  5. h5-23-百度地图api

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  6. PHP使用iconv函数遍历数组转换字符集

    /** * 字符串/二维数组/多维数组编码转换 * @param string $in_charset * @param string $out_charset * @param mixed $dat ...

  7. P1979 华容道 spfa题解

    题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...

  8. AJPFX总结java开发常用类(包装,数字处理集合等)(三)

    4.Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射.对于键对象来说,像Set一样,一 个Map容器中的键对象不允许重复,这是为了保持查找 ...

  9. laravel学习笔记(三)

    模型传值 路由: Route::get('/posts/{post}','\App\Http\Controllers\PostController@show'); 方法: public functio ...

  10. jstat查看JVM的GC情况

    jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上 ...