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{ ...
随机推荐
- IDEA 运行maven项目配置
- Android书架实现
转自http://blog.csdn.net/wangkuifeng0118/article/details/7944215 书架效果: 下面先看一下书架的实现原理吧! 首先看一下layout下的布局 ...
- 利用阿里大于实现发送短信(JAVA版)
本文是我自己的亲身实践得来,喜欢的朋 友别忘了点个赞哦! 最近整理了一下利用阿里大于短信平台来实现发送短信功能. 闲话不多说,直接开始吧. 首先,要明白利用大于发送短信这件事是由两部分组成: 一.在阿 ...
- Directx11教程(21) 修正程序最小化异常bug
原文:Directx11教程(21) 修正程序最小化异常bug 很长时间竟然没有注意到,窗口最小化时候,程序会异常,今天调试水面程序时,随意间最小化了窗口,发现程序异常了.经过调试,原来程 ...
- js(jquery)鼠标移入移出事件时,出现闪烁、隐藏显示隐藏显示不停切换的情况
<script> $(".guanzhu").hover(function(){ $(".weixinTop").show(); },functio ...
- 网络流24题 搭配飞行员(DCOJ8000)
题目描述 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭 ...
- PLAY2.6-SCALA(六) 异步处理结果
1.创建异步的controller Play是一个自底向上的异步框架,play处理所有的request都是异步.非阻塞的.默认的方式是使用异步的controller.换句话说,contrller中的应 ...
- Linux 下的mysql+centos7+主从复制
mysql+centos7+主从复制 MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公 ...
- ural1297 后缀数组+RMQ
RMQ即求区间(i,j)的最值.通过O(nlogn)处理,O(1)给出答案. RMQ主要是动态规划来做.dp[i][j]表示从i开始的长为2^j的区间最值. 那么可以得到dp[i][j]=max(dp ...
- iOS 警告收录及科学快速的消除方法
http://www.cocoachina.com/ios/20150914/13287.html 作者:董铂然 授权本站转载. 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉 ...