**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. Leetcode859.Buddy Strings亲密字符串

    给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A = "ab& ...

  2. Leetcode703.Kth Largest Element in a Stream数据流中的第K大元素

    设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中 ...

  3. php怎么自动加载

    在 PHP 代码的顶部你是不是经常看到这样的代码. require 'lionis.php'; require 'is.php'; require 'cool.php'; 如果只是引入几个 PHP 脚 ...

  4. 【linux】Ubuntu16.04中文输入法安装

    最近刚给笔记本装了Ubuntu+win10双系统,但是ubuntu16.04没有自带中文输入法,所以经过网上的一些经验搜索整合,分享一下安装中文输入法的心得.本文主要介绍了谷歌拼音跟ibus中文输入法 ...

  5. 【JZOJ4934】【NOIP2017GDKOI模拟1.12】a

    helpless fucking 结论:如果一个数可以被对于a序列中每个数的最大公约数整除,那么它就是好的. Bitch Man 感性证明: 贪心地想,对于a序列中的任意两个数,它们的最大公约数可由这 ...

  6. 【JZOJ4762】【NOIP2016提高A组模拟9.7】千帆渡

    题目描述 输入 输出 样例输入 5 1 4 2 5 1 4 1 1 2 4 样例输出 2 1 4 数据范围 解法 设f[i][j]表示前 i个蓝色帆船中,选择了第 j个红色帆船作为结尾的最大答案. 那 ...

  7. nginx简单使用

    nginx开启./nginx重启./nginx -s reload关闭./nginx -s stop或quit

  8. bzoj1614 架设电话线

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  9. Python中并发前戏之操作系统

    进程: 1.串行: 一个任务完完整整地运行完毕后,才能运行下一个任务 2.并发 看起来多个任务是同时运行的即可,单核也可以实现并发 3.并行: 真正意义上多个任务的同时运行,只有多核才实现并行 1.什 ...

  10. Codeforces Round #323 (Div. 2) Once Again... CodeForces - 582B 最长非下降子序列【dp】(不明白)

    B. Once Again... time limit per test 1 second memory limit per test 256 megabytes input standard inp ...