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 数组 预处理可以先计算出一棵树的重量,简化计 ...
随机推荐
- windows 20003 扩展安装后不成功的原因
windows扩展如果安装不成功(PHP扩展)很大的可能就是那个DLL的权限不够.需要分配:AdministratorAuthenticater UsersIIS_WPGSYSTEMUsers
- php中调用其他系统http接口的方法说明
使用函数: file_get_contents($url); 传入接口url及其参数:如 $url="http://192.168.1.1/test.jsp?id=1&type=2& ...
- WCF上传、下载、删除文件
关键代码: --上传的stream处理,转为bytep[] private void Parse(Stream stream, Encoding encoding) { this.Success = ...
- How to handle the DbEntityValidationException in C#
When I want to use db.SaveChanges(), if some of the columns got validation error and throw DbEntityV ...
- 使用Qt创建第一个OpenCV的Gui应用
写在前面 学习OpenCV有一些小日子了,发现群里还有很多初学OpenCV的人像我当初一样跌跌撞撞到处找资料,所以在这里把学习笔记分享给大家,希望有志学习OpenCV进行计算机视觉活动的小伙伴们能少走 ...
- CentOS Device eth0 does not seem to be present 解决方案
1. vi /etc/udev/rules.d/70-persistent-net.rules 记录eth1 的网卡地址 2.vi /etc/sysconfig/network-scrpits/ifc ...
- python3 读取大文件分解成若干小文件
有个数据实在太大了,有1.7G,打开慢,改文件也慢,我们将其分解成若干个中等文件 #!/usr/bin/env python3 # -*- coding: utf-8 -*- f = open(& ...
- bootstrap学习--什么是bootstrap
2011年,twitter的“一小撮”工程师为了提高他们内部的分析和管理能力,用业余时间为他们的产品构建了一套易用.优雅.灵活.可扩展的前端工具集--BootStrap.Bootstrap由MARK ...
- One-day-学习笔记-商品成交时发送短信
个人学习笔记(one) 根据需求:商品成交时发送短信 html代码省略..... Model代码省略..... /* * --------------------------------------- ...
- wdcp对default站点开启apache url重写功能
网站开启对default网站的重写功能