整个题考虑起来 最主要要计算的状态 是树的状态 于是要计算出所有可能挂坠可能组成的树的所有形态 tree 用于保存这些状态 

考虑不要重复计算,有一个vis 数组 

预处理可以先计算出一棵树的重量,简化计算

#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm> using namespace std;
const int maxn=6;
int w[6];//各个重量
int sum[1<<maxn]; //储存在i集合树的情况下总重量
int n,s;
double r;
int vis[1<<maxn];//探究当前组成的树是否被构造过 struct Tree{
double r,l;
Tree(): r(0),l(0){
}
};
vector<Tree>tree[1<<maxn];//下标的树组成的全部可能形态
void dfs(int root){ //计算以root 组成一棵树的所有可能形态,并标记已记录
if(vis[root])return;
vis[root]=true;
bool ok=false;
for(int left=root&(root-1);left;left=(left-1)&root){
int right=left^root;
ok=true;
dfs(left);
dfs(right);
double d1=(sum[left]*1.0)/(sum[root]*1.0);
double d2=(sum[right]*1.0)/(sum[root]*1.0);
for(int i=0;i<tree[left].size();i++){
for(int j=0;j<tree[right].size();j++){
Tree t;
t.l=max(tree[left][i].l+d1,tree[right][j].l-d2);
t.r=max(tree[left][i].r-d2,tree[right][j].r+d2);
if(t.l+t.r<r)tree[root].push_back(t);
}
}
}
if(!ok)tree[root].push_back(Tree());//如果当前树只有一个挂坠,那么这是一个空树
}
int main()
{
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
cin>>n;
while(n--){
cin>>r>>s;
for(int i=0;i<s;i++){
cin>>w[i]; }
for(int i=0;i< 1<<s;i++){
vis[i]=false;
tree[i].clear();
sum[i]=0;
for(int j=0;j<s;j++){
if(i&(1<<j))sum[i]+=w[j];
}
}//存储重量的预处理 利用一个二进制数存储了所有的信息;
int root=(1<<s)-1;
dfs(root);
long double ans=-1;
for(int i=0;i<tree[root].size();i++){
if(tree[root][i].l+tree[root][i].r>ans)ans=tree[root][i].l+tree[root][i].r;
}
cout<<ans<<endl;
}
}  

UVa 1354 天平难题 Mobile Computing的更多相关文章

  1. UVa 1354 天平难题

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

  2. UVa 1354 枚举子集 Mobile Computing

    只要枚举左右两个子天平砝码的集合,我们就能算出左右两个悬挂点到根悬挂点的距离. 但是题中要求找尽量宽的天平但是不能超过房间的宽度,想不到要怎样记录结果. 参考别人代码,用了一个结构体的vector,保 ...

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

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

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

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

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

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

  6. UVa 839 -- Not so Mobile(树的递归输入)

    UVa 839 Not so Mobile(树的递归输入) 判断一个树状天平是否平衡,每个测试样例每行4个数 wl,dl,wr,dr,当wl*dl=wr*dr时,视为这个天平平衡,当wl或wr等于0是 ...

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

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

  8. 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 ...

  9. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

随机推荐

  1. Unity上一页下一页切换功能实现源码(仅供参考)

    在做项目时我们有时需要实现切换上一页下一页图片,切换上一首下一首歌曲等等类似的功能.这里写了个简单的实现源码(仅供参考),要是有更好的方法欢迎提出来,共同进步~ 以切换上一页下一页图片为例: usin ...

  2. javascript网址收集

    1.模块的写法http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 2.模块规范 AMDhttp://www.ruanyifeng ...

  3. hammerJs-v2.0.4详解

    一.前言 移动端框架当前还处在初级阶段,但相对于移动端的应用来说已经有很长时间了.虽然暂时还没有PC端开发的需求量大,但移动端的Web必然是一种趋势,在接触移动端脚本的过程中,最开始想到的是juqer ...

  4. ubuntu下postgreSQL安装配置

    一.安装并配置,并设置远程登陆的用户名和密码 1.安装postgreSQL sudo apt-get update sudo apt-get install postgresql-9.4 在Ubunt ...

  5. 增强VPS SSH账号安全:改端口,禁用Root,密钥登录,Denyhosts防暴力攻击

    VPS SSH账号是我们日常管理VPS的主要登入方式,尤其是Root账号,对Linux系统安全至关重要.以前好多站长喜欢用Putty中文版,这实际是别人修改官方Putty汉化而来,这些软件被植入了后门 ...

  6. delphi.指针.应用

    注:初稿...有点乱,可能增删改... 因为指针应用,感觉不好写,请大家指出错误,谢谢. 注意: 本文着重点讲的是指针的各类型的应用或使用,而不是说这种方法不应该+不安全+危险+不提倡使用. 其它:本 ...

  7. ssh整合需要那些jar

    struts2  commons-logging-1.0.4.jar -------主要用于日志处理 freemarker-2.3.8.jar ------- 模板相关操作需要包 ognl-2.6.1 ...

  8. Android 软引用

    2013-08-13 13:56 佚名 eoe Android开发者社区 字号:T | T   可能对于Android开发者来说,软引用这个词有的会不是很熟悉,软引用在Java开发中用的比较多,但是, ...

  9. ES6新特性之模板字符串

    ES6新特性概览  http://www.cnblogs.com/Wayou/p/es6_new_features.html 深入浅出ES6(四):模板字符串   http://www.infoq.c ...

  10. gulp.js基础入门

    安装 Node 去 nodejs.org 根据系统选择性按照教程安装Node. 创建项目 创建项目文件夹 进入项目文件夹 初始化项目 使用npm命令:npm init,根据提示完成. 安装 Gulp ...