**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. 【POJ 3294】Life Forms

    [链接]h在这里写链接 [题意] 给你n个字符串. 让你找最长的字符串s; 这个s在超过一半的子串里面都有出现过且长度大于n/2; 如果有多个,输出多行. (按字典序输出) 也没说会不会出现大写. [ ...

  2. Framework7 无限滚动

    html结构 <div class="page"> <div class="page-content infinite-scroll"> ...

  3. pl/sql进阶一控制结构

    在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...

  4. Oracle中事物处理--事物隔离级别

    n  事物隔离级别 概念:隔离级别定义了事物与事物之间的隔离程度. ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而已,不同的数据库在实现时有所不同) ...

  5. 一条SQL完成跨数据库实例Join查询

    背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...

  6. JavaScript--时间日期格式化封装

    这是一个正常的封装: 其他非正常的请按照以下语句自由搭配 <!DOCTYPE html> <html lang="en"> <head> < ...

  7. Servlet过虑器

    过滤器是在请求的预处理和后处理时调用的对象. 主要用于执行转换,日志记录,压缩,加解密,输入验证等过滤任务. servlet过滤器是可插拔的,即它在web.xml文件中定义,如果从web.xml文件中 ...

  8. 将nginx搜集到的日志通过flume转到hive

    背景介绍: Nginx为app打点数据,打点日志每小时滚动一次.目录结构如下 文件中的数据如下( cat -A 2019072414r.log 后的结果,-A为显示隐形的符号,下方^A为指定的分隔符. ...

  9. GIL锁更加深刻理解

    参考链接:http://www.cnblogs.com/ajaxa/p/9111884.html

  10. python 语法错误