UVa 1354 Mobile Computing[暴力枚举]
**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
5
1.3
3
1
2
1
1.4
3
1
2
1
2.0
3
1
2
1
1.59
4
2
1
1
3
1.7143
4
1
2
3
5
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[暴力枚举]的更多相关文章
- 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 ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- Uva 1354 Mobile Computing
题目链接 题意: 在一个宽为r 的房间里, 有s个砝码, 每个天平的一端要么挂砝码, 要么挂另一个天平, 并且每个天平要保持平衡. 求使得所有砝码都放在天平上, 且总宽度不超过房间宽度的最大值. 思路 ...
- UVA - 11464 Even Parity 【暴力枚举】
题意 给出一个 01 二维方阵 可以将里面的 0 改成1 但是 不能够 将 1 改成 0 然后这个方阵 会对应另外一个 方阵 另外一个方阵当中的元素 为 上 下 左 右 四个元素(如果存在)的和 要求 ...
- 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 ...
- UVA 10976 Fractions Again?!【暴力枚举/注意推导下/分子分母分开保存】
[题意]:给你一个数k,求所有使得1/k = 1/x + 1/y成立的x≥y的整数对. [分析]:枚举所有在区间[k+1, 2k]上的 y 即可,当 1/k - 1/y 的结果分子为1即为一组解. [ ...
- UVA.12716 GCD XOR (暴力枚举 数论GCD)
UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...
- 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 ...
- uva 11088 暴力枚举子集/状压dp
https://vjudge.net/problem/UVA-11088 对于每一种子集的情况暴力枚举最后一个三人小组取最大的一种情况即可,我提前把三个人的子集情况给筛出来了. 即 f[S]=MAX{ ...
随机推荐
- 洛谷3861八月月赛A题解
链接 用f[i][j]表示乘积为i的,包含的最大数小于等于j时的方案总数 我们先考虑所用的数为1到n的情况 最后的答案就是f[n][n]-1 转移时考虑f[i][j]可以转移到的状态 显然f[i][j ...
- js实现动态计数效果
下面附有数字图片和数字边框图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 怎么使用mysqlreplicate快速搭建MySQL主从呢?
用其中的mysqlreplicate工具来快速搭建MySQL主从环境. HE1:192.168.1.248 slave HE3:192.168.1.250 master 实战 Part1:安装mysq ...
- .net WebServer示例及调用(接口WSDL动态调用 JAVA)
新建.asmx页面 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
- nodeJs koa-generator脚手架
koa-generator 脚手架 全局安装:cnpm install -g koa-generator 查看版本:koa2 --version 创建项目:koa2 project 默认的是用jade ...
- 【转载】CPU相关总结
What is the difference between Processor, Core, Logical Processor ? Processor : It’s the physical co ...
- Please upgrade the installed version of powershell to the minimum required version and run the command again.
版权声明:本文为博主原创文章,转载请注明出处.谢谢 https://blog.csdn.net/cow66/article/details/77993908 我的系统是windows 7 安装了vag ...
- [React Native]去掉WebStorm中黄色警告
用WebStorm开发RN难免会碰到一大堆黄色警告.就像下面这样. 其实这个错误并不会影响开发,但是作为一个上升处女座的,我很难忍.于是各种想办法. 上网查了半天发现这篇文章 http://blog. ...
- UITextField 自定义clearButton背景色
一个鸡贼的解决方案,适用于自定义clearButton的样式,直接修改背景图即可 1. 实现基于UITextField的category并添加如下方法及声明 - (void)setLightStyle ...
- Python中的生产者消费者模型
---恢复内容开始--- 了解知识点: 1.守护进程: ·什么是守护进程: 守护进程其实就是一个‘子进程’,守护即伴随,守护进程会伴随主进程的代码运行完毕后而死掉 ·为何用守护进程: 当该子进程内的代 ...