**1354 Mobile Computing**

There is a mysterious planet called Yaen, whose space is 2-dimensional. There are many beautiful stones on the planet, and the Yaen people love to collect them. They bring the stones back home and make nice mobile arts of them to decorate their 2-dimensional living rooms. 
In their 2-dimensional world, a mobile is defined recursively as follows: 
• a stone hung by a string, or 
• a rod of length 1 with two sub-mobiles at both ends; the rod is hung by a string at the center of gravity of sub-mobiles. When the weights of the sub-mobiles are n and m, and their distances from the center of gravity are a and b respectively, the equation n × a = m × b holds. 
For example, if you got three stones with weights 1, 1, and 2, here are some possible mobiles and their widths: 
Given the weights of stones and the width of the room, your task is to design the widest possible mobile satisfying both of the following conditions. 
• It uses all the stones. 
• Its width is less than the width of the room. 
You should ignore the widths of stones. 
In some cases two sub-mobiles hung from both ends of a rod might overlap (see the figure on the right). Such mobiles are acceptable. The width of the example is (1/3) + 1 + (1/4). 
Input 
The first line of the input gives the number of datasets. Then the specified number of datasets follow. A dataset has the following format. 
r s w1 . 
ws 
r is a decimal fraction representing the width of the room, which satisfies 0 < r < 10. s is the number of the stones. You may assume 1 ≤ s ≤ 6. wi is the weight of the i-th stone, which is an integer. You may assume 1 ≤ wi ≤ 1000. 
Input 
The first line of the input gives the number of datasets. Then the specified number of datasets follow. A dataset has the following format. 
r s w1 . 
ws 
r is a decimal fraction representing the width of the room, which satisfies 0 < r < 10. s is the number of the stones. You may assume 1 ≤ s ≤ 6. wi is the weight of the i-th stone, which is an integer. You may assume 1 ≤ wi ≤ 1000. 
You can assume that no mobiles whose widths are between r − 0.00001 and r + 0.00001 can be made of given stones. 
Output 
For each dataset in the input, one line containing a decimal fraction should be output. The decimal fraction should give the width of the widest possible mobile as defined above. An output line should not contain extra characters such as spaces. 
In case there is no mobile which satisfies the requirement, answer ‘-1’ instead. 
The answer should not have an error greater than 0.00000001. You may output any numb er of digits after the decimal point, provided that the ab ove accuracy condition is satisfied. 
Sample Input 

1.3 




1.4 




2.0 




1.59 





1.7143 





Sample Output 
-1 
1.3333333333333335 
1.6666666666666667 
1.5833333333333335 
1.7142857142857142

解题思路: 
1.采用自底向上的方法枚举树——每次随机选取两棵子树合并成一棵树,每个结点依次编号。 
2.对于一棵确定的树,其长度必然可以确定。以根结点为坐标轴原点,dfs计算每个结点相对根结点的距离即可求出该树宽度。 
注意:输入只有一块石头时,输出0;

 #include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
const int maxn=;
int lchild[maxn];//左孩子编号
int rchild[maxn];//右孩子编号
int wight[maxn];//编号对应的质量
int vis[maxn];//-1表示编号不存在 0表示编号不在树中 1表示在树中
double dis[maxn]; double r,ans;
int s;
void init(){
ans=;
memset(lchild, -, sizeof lchild);
memset(rchild, -, sizeof rchild);
memset(wight,,sizeof wight);
memset(vis, -, sizeof vis);
} void calculate(int id){//计算每个编号相对根结点的距离
if(lchild[id]!=-){
dis[lchild[id]]=dis[id]-double(wight[rchild[id]])/double(wight[lchild[id]]+wight[rchild[id]]);
dis[rchild[id]]=dis[id]+double(wight[lchild[id]])/double(wight[lchild[id]]+wight[rchild[id]]);
calculate(lchild[id]);
calculate(rchild[id]);
}
} void search(int cnt,int m){//m为此阶段石头最大编号
if(cnt==){
memset(dis, , sizeof dis);
calculate();
double a=,b=;
for(int i=;i<maxn;i++){
if(dis[i]<a) a=dis[i];
if(dis[i]>b) b=dis[i];
}
double c=b-a;
// cout<<" "<<c<<endl;
if(c<r&&c>ans) ans=c;
return ;
}
for(int i=;i<maxn;i++){
if(vis[i]==){
vis[i]=;
for(int j=;j<maxn;j++){
if(vis[j]==){
vis[j]=;
if(cnt==){ lchild[]=i;rchild[]=j;
wight[]=wight[i]+wight[j];
search(cnt-,m);
}
else{ vis[m+]=;
lchild[m+]=i;rchild[m+]=j;
wight[m+]=wight[i]+wight[j];
search(cnt-,m+);
vis[m+]=-;
}
vis[j]=;
}
}
vis[i]=;
}
}
}
int main() {
//freopen("input.txt", "rb", stdin);
//freopen("output.txt","wb",stdout);
int N;
scanf("%d",&N);
while(N--){
init();
scanf("%lf%d",&r,&s); for(int i=;i<=s;i++){
scanf("%d",&wight[i]);
vis[i]=;
}
if(s==) {printf("%.16f\n",ans);continue;}
search(s,s);
if(ans==) cout<<"-1"<<endl;
else printf("%.16f\n",ans);
}
return ;
}

UVa 1354 Mobile Computing[暴力枚举]的更多相关文章

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

  2. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  3. Uva 1354 Mobile Computing

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

  4. UVA - 11464 Even Parity 【暴力枚举】

    题意 给出一个 01 二维方阵 可以将里面的 0 改成1 但是 不能够 将 1 改成 0 然后这个方阵 会对应另外一个 方阵 另外一个方阵当中的元素 为 上 下 左 右 四个元素(如果存在)的和 要求 ...

  5. UVa 10603 Fill [暴力枚举、路径搜索]

    10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive intege ...

  6. UVA 10976 Fractions Again?!【暴力枚举/注意推导下/分子分母分开保存】

    [题意]:给你一个数k,求所有使得1/k = 1/x + 1/y成立的x≥y的整数对. [分析]:枚举所有在区间[k+1, 2k]上的 y 即可,当 1/k - 1/y 的结果分子为1即为一组解. [ ...

  7. UVA.12716 GCD XOR (暴力枚举 数论GCD)

    UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...

  8. UVA 10012 How Big Is It?(暴力枚举)

      How Big Is It?  Ian's going to California, and he has to pack his things, including his collection ...

  9. uva 11088 暴力枚举子集/状压dp

    https://vjudge.net/problem/UVA-11088 对于每一种子集的情况暴力枚举最后一个三人小组取最大的一种情况即可,我提前把三个人的子集情况给筛出来了. 即 f[S]=MAX{ ...

随机推荐

  1. 修改mysql数据库密码的3中方法

    方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass ...

  2. PHP学习(函数)

    可变函数,即通过变量的值来调用函数,因为变量的值是可变的,所以可以通过改变一个变量的值来实现调用不同的函数. 经常会用在回调函数.函数列表,或者根据动态参数来调用不同的函数.可变函数的调用方法为变量名 ...

  3. SPARK Day04

    广播变量和累加器 广播变量 广播变量理解图 广播变量使用 val conf = new SparkConf() conf.setMaster("local").setAppName ...

  4. Directx11教程37 纹理映射(7)

    原文:Directx11教程37 纹理映射(7)     本章是在教程35.36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理.    lighttex.vs中顶点的结构现在 ...

  5. ios开发使用Basic Auth 认证方式

    http://blog.csdn.net/joonchen111/article/details/48447813 我们app的开发通常有2种认证方式   一种是Basic Auth,一种是OAuth ...

  6. oracle如何看审计的结果

    1)数据库初始化参数文件中AUDIT_TRAIL=OS时,审计记录存在操作系统的文件中. UNIX系统的话,默认存在“$oracle_home/rdbms/audit/” 目录下. If you ha ...

  7. ORA-03113: end-of-file on communication channel 解决方案

    Oracle启动时报如下错误:ORA-03113: end-of-file on communication channel  解决方案如下:1.查看orcle启动日志,确定具体是什么原因引起的错误. ...

  8. idea建立maven聚合项目 标签: mavenidea 2017-01-08 15:33 2477人阅读 评论(30)

    上篇文章写了如何用idea建立maven项目,idea建立maven聚合项目我感觉不如eclipse方便,不过并不是没有办法,下面写一下这个小教程. 建立maven project 建立maven p ...

  9. @atcoder - AGC036D@ Negative Cycle

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N 个点的有向带权图,从 0 编号到 N - 1.一开 ...

  10. 从DataTable中删除不被控件支持的字段类型

    DataTable dt = DB.GetDataTable(sql);                        //从dt中删除不被控件支持的字段类型            for (int ...