Uva 1354 Mobile Computing
题意:
在一个宽为r 的房间里, 有s个砝码, 每个天平的一端要么挂砝码, 要么挂另一个天平, 并且每个天平要保持平衡。
求使得所有砝码都放在天平上, 且总宽度不超过房间宽度的最大值。
思路:
每个节点只能有两个子节点, 这是一棵二叉树的形式。
通过枚举二叉树的形态, 再枚举每一个叶子节点所放砝码, 最后再计算每个方案的宽度并计算答案。
每增加一个天平, 那么可以放砝码数 + 1。
note:
坑在0的输出了, 用primtf("%.9lf\n", 0)输出来的是0 用0.0来输出才是0.000000 惨wa三发。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define eps 1e-5
#define MAXN 110
#define MAXM 100
#define dd {cout<<"debug"<<endl;}
#define pa {system("pause");}
#define p(x) {cout<<x<<endl;}
#define pd(x) {printf("%.7lf\n", x);}
#define k(x) {printf("Case %d: ", ++x);}
#define s(x) {scanf("%d", &x);}
#define sd(x) {scanf("%lf", &x);}
#define mes(x, d) {memset(x, d, sizeof(x));}
#define do(i, x) for(i = 0; i < x; i ++)
#define dod(i, x, l) for(i = x; i >= l; i --)
#define doe(i, x) for(i = 1; i <= x; i ++)
int n;
double r, ans;
double w[MAXN], v[MAXN];
double ll[MAXN], rr[MAXN];
bool vis[MAXN];
int order[MAXN];
void read()
{
scanf("%lf", &r);
scanf("%d", &n);
for (int i = ; i <= n; i ++)
scanf("%lf", &w[i]);
}
void get_ans(int u)
{
memset(ll, , sizeof(ll));
memset(rr, , sizeof(rr));
memset(v, , sizeof(v)); for (int i = u; i > ; i --)
{
if (order[i] == -)
{
int x = i * ;
int y = i * + ;
v[i] = v[x] + v[y];
double li = v[y] / v[i];
double ri = v[x] / v[i]; ll[i] = min(-li + ll[x], ri + ll[y]);
rr[i] = max(-li + rr[x], ri + rr[y]);
}
else if (order[i])
{
v[i] = w[order[i]];
}
} double temp = rr[] - ll[];
//printf("%.9lf\n", temp);
if (temp - r < eps && temp > ans)
ans = temp;
} void dfs(int u, int num, int count)
{
//printf("%d %d %d\n", u, num, count);
if (count == )
{
get_ans(u - );
return ;
}
else if (order[u / ] != -)
{
dfs(u + , num, count);
}
else
{
if (count > num)
{
order[u] = -;
dfs(u + , num + , count);
order[u] = ;
} if (num == && count > )
return ;
for (int i = ; i <= n; i ++)
if (!vis[i])
{
vis[i] = true;
order[u] = i;
dfs(u + , num - , count - );
order[u] = ;
vis[i] = false;
}
}
}
void solve()
{
memset(vis, false, sizeof(vis));
memset(order, , sizeof(order));
ans = -;
if (n == ) printf("%.10lf\n", 0.0);
else
{
order[] = -;
dfs(, , n);
printf(ans == -? "-1\n" : "%.10lf\n", ans);
}
} int main()
{
int T;
scanf("%d", &T);
while (T --)
{
read();
solve();
}
return ;
}
Uva 1354 Mobile Computing的更多相关文章
- UVa 1354 Mobile Computing[暴力枚举]
**1354 Mobile Computing** There is a mysterious planet called Yaen, whose space is 2-dimensional. Th ...
- 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
- Mobile Computing: the Next Decade论文 cloudlet薄云
1 Introduction “Information at your fingertips anywhere, anytime” has been the driving vision of mob ...
- UVa 1354 天平难题 Mobile Computing
整个题考虑起来 最主要要计算的状态 是树的状态 于是要计算出所有可能挂坠可能组成的树的所有形态 tree 用于保存这些状态 考虑不要重复计算,有一个vis 数组 预处理可以先计算出一棵树的重量,简化计 ...
- UVa 1354 枚举子集 Mobile Computing
只要枚举左右两个子天平砝码的集合,我们就能算出左右两个悬挂点到根悬挂点的距离. 但是题中要求找尽量宽的天平但是不能超过房间的宽度,想不到要怎样记录结果. 参考别人代码,用了一个结构体的vector,保 ...
- 【例题 7-7 UVA - 1354】Mobile Computing
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 秤砣都是在叶子节点. 可以把它看成一个二叉树. 则我们每次只需要选择任意两个"节点",让他们组成一棵二叉树就可以 ...
- UVa 1354 天平难题
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- uva 688 - Mobile Phone Coverage
经典问题,矩形面积并. 解法:一.矩形分割,每个矩形的两个横坐标和两个纵坐标排序,这样得到2n*2n个区间,对这些区间依次判断是否包含在n个矩形中间即可. 二.扫描线.具体还没实现过. 详见 ...
随机推荐
- C# - 转换
无论什么类型 它们存储的其实都是一系列的位 在将A类型转换为B类型时 如果能完整转换 那么系统会将两个操作数自动进行隐式转换 但也有可能因为A类型的存储位数比B类型的存储位数大 那么B类型可能就没有足 ...
- jquery动态添加列表后样式失效解决方式
最近在做一个通讯录,使用jquery mobile方式来做,在动态添加列表后,listview原有的样式失效,折腾一会,找出解决办法.代码如下. <%@ page language=" ...
- TCP/IP协议原理与应用笔记14:电路交换 和 分组交换
1. 电路交换: (1)建立连接 (2)数据传输 (3)拆除连接 2. 分组交换 (1)数据报: 根据网络的特性,将数据报分成不同大小的部分,经过不同网路传递到相同的目的地.如下: 这里A--X 和 ...
- MAC上搭建Jenkins + Android + IOS自动开发部署环境
因为MAC是大小写不敏感的操作系统,很多Linux命令不支持,所以首先要创建大小写敏感的操作系统. 设置静态IP 打开"System Preferences..." 点击" ...
- verilog 常用系统函数及例子
1.打开文件 integer file_id; file_id = fopen("file_path/file_name"); 2.写入文件:$fmonitor,$fwrite,$ ...
- webstom 配置git 后左侧菜单栏配色调整
ws配置了git进行版本管理,但是最近改了主题,发现左侧列表的文件名的颜色都是一个颜色了.我想要的是,对未提交的文件用颜色区分,新建的,修改的,冲突的分别设置不同的颜色,不知在哪里能设置,求助 老规矩 ...
- C#中params使用
1.参数被params修饰即为可变参数,params只能修饰一维数组. 2.给可变参数赋值的时候,可以直接传递数组的元素. 3.在调用的时候,会自动将这些元素封装为一个数组,并将数组传递. 4.可变参 ...
- 转:四种方案解决ScrollView嵌套ListView问题
转载自:http://blog.sina.com.cn/s/blog_46798aa80101lxbk.html 原始的连接已经不知道是哪里了,项目中遇到了同样的问题,花了一下午都没有想到是嵌套引起的 ...
- 关于ligerui 中 grid 表格的扩展搜索功能在远程数据加载时无法使用的解决办法
要想使用grid里的扩展搜索功能,除了要引用ligerui主要的js文件外,还必须引入下面的JS文件: 1.Source\demos\filter\ligerGrid.showFilter.js 2. ...
- windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法
windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法: 最近安装完发现8.1系统后,ubuntu无法加载以前的ntfs分区了,特别是我添加到了/etc/fstab里面了 导致 ...