Problem UVA1354-Mobile Computing

Accept:267  Submit:2232

Time Limit: 3000 mSec

 Problem Description

 Input

 Output

 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 Ouput

-1

1.3333333333333335

1.6666666666666667

1.5833333333333335

1.7142857142857142

题解:感觉这个题挺难的。把一个天平看作一棵树,叶子节点是砝码,当确定了这棵树的形状及叶子节点的值之后这个天平的长度就是确定的,思路就来自于此。

下面的事情就是枚举子集,以我目前的能力实现起来确实有困难,参考了lrj的代码,这种二进制枚举子集的方式值得学习。

P.S.0有可能是合法输出,而我一开始设Max = 0.0,当没有更新时输出-1,WAWAWAWAWA......

 #include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std; const int maxn = ;
int n;
double r,sum[<<maxn];
double w[maxn]; struct Tree{
double L,R;
Tree(double L = 0.0,double R = 0.0) :
L(L),R(R) {}
}; vector< vector<Tree> > tree(<<maxn);
bool vis[<<maxn]; void dfs(int subset){
if(vis[subset]) return;
vis[subset] = true;
bool have_child = false;
for(int left = (subset-)&subset;left;left = (left-)&subset){
have_child = true;
int right = subset^left;
double d1 = sum[right]/sum[subset],d2 = sum[left]/sum[subset];
dfs(left),dfs(right);
for(int i = ;i < tree[left].size();i++){
for(int j =;j < tree[right].size();j++){
Tree t;
t.L = max(tree[left][i].L+d1,tree[right][j].L-d2);
t.R = max(tree[right][j].R+d2,tree[left][i].R-d1);
if(t.R+t.L < r) tree[subset].push_back(t);
}
}
}
if(!have_child) tree[subset].push_back(Tree());
} int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int iCase;
scanf("%d",&iCase);
while(iCase--){
scanf("%lf%d",&r,&n);
for(int i = ;i < n;i++){
scanf("%lf",&w[i]);
}
memset(vis,false,sizeof(vis));
for(int i = ;i < (<<n);i++){
sum[i] = 0.0;
tree[i].clear();
for(int j = ;j < n;j++){
if(i&(<<j)) sum[i] += w[j];
}
}
int root = (<<n)-;
dfs(root);
double Max = -;
for(int i = ;i < tree[root].size();i++){
Max = max(Max,tree[root][i].L+tree[root][i].R);
}
printf("%.10lf\n",Max);
}
return ;
}

UVA1354-Mobile Computing(二进制枚举子集)的更多相关文章

  1. 紫书 例题 11-3 UVa 1151 (有边集的最小生成树+二进制枚举子集)

    标题指的边集是说这道题的套餐, 是由几条边构成的. 思路是先做一遍最小生成树排除边, 因为如果第一次做没有加入的边, 到后来新加入了很多权值为0的边,这些边肯定排在最前面,然后这条边的前面的那些边肯定 ...

  2. UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)

    题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...

  3. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  4. 杭电多校第十场 hdu6435 CSGO 二进制枚举子集

    CSGO Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Subm ...

  5. UVA 1151二进制枚举子集 + 最小生成树

    题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...

  6. 南阳OJ-91-阶乘之和---二进制枚举(入门)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=91 题目大意: 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为 ...

  7. hdu1045 Fire Net---二进制枚举子集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意: 给你一幅n*n的图,再给你一些点,这些点的上下左右不能再放其他点,除非有墙('X') ...

  8. POJ 3279 Fliptile(反转 +二进制枚举)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13631   Accepted: 5027 Descrip ...

  9. UVa 1354 Mobile Computing[暴力枚举]

    **1354 Mobile Computing** There is a mysterious planet called Yaen, whose space is 2-dimensional. Th ...

随机推荐

  1. word转PDF,PDF转Image,使用oppenOffice注意事项等

    最近在电子合同等项目中需要把word或者pdf转换成image,用到了openOffice把word转换pdf,以及把pdf转换成图片 感谢小伙伴张国清花费了三天时间来实现了此功能.下面我将把具体的步 ...

  2. linux 单引号,双引号,反引号

    单引号 目的: 为了保护文字不被转换.除了他本身. 就是说除去单引号外, 在单引号内的所有文字都是原样输出. 1. [root@jszwl161 SP49EP9]# echo '$*><! ...

  3. 让MySQL查询更加高效——对查询进行重构

    在优化有问题的查询时,目标应该是找到一个更优的方法获得实际需要的结果,而不是一定总是要求从MySQL获取一模一样的结果集 一个复杂查询还是多个简单查询 设计查询的时候一定需要考虑的问题就是,是否需要将 ...

  4. C#导入Excel、Excel导入、导入.xls 、导入.xlsx、Excel2003版本、Excel2007版本

    C#导入Excel: 1.选择Excel 03版文件 2.选择需要读取数据的Excel工作表   3.选择工作表中需要读取的列 源码地址在图片下面,不要点击图片,点击下载地址跳转下载.

  5. es6 语法 (函数扩展)

    //函数参数默认值(more值后不能有参数) { function test(x,y = 'world'){ console.log('默认值',x,y); } test('hello');// he ...

  6. JS单体内置对象之Math常用方法(min,max,ceil,floor,round,random等)

    1.min()和max()方法 Math.min()用于确定一组数值中的最小值.Math.max()用于确定一组数值中的最大值. alert(Math.min(2,4,3,6,3,8,0,1,3)); ...

  7. 洛谷P4577 [FJOI2018]领导集团问题(dp 线段树合并)

    题意 题目链接 Sol 首先不难想到一个dp,设\(f[i][j]\)表示\(i\)的子树内选择的最小值至少为\(j\)的最大个数 转移的时候维护一个后缀\(mx\)然后直接加 因为后缀max是单调不 ...

  8. maven 继承

    一个 maven 项目可以继承另一个 maven 的依赖, 称为子项目 父项目 使用场景: 多个子项目都需要某些依赖, 就可以把子项目共同的依赖抽取到父项目中, 子项目通过继承得到这些依赖, 这样也更 ...

  9. Thrift的C++服务端(线程池和非阻塞)模式

    非阻塞模式 #include "RpcServiceHandler.h" #include <thrift/concurrency/ThreadManager.h> # ...

  10. AIOps 平台的误解,挑战及建议(中)— AIOps常见的误解

    本文篇幅较长,分为上,中,下,三个部分进行连载.内容分别为:AIOps 背景/所应具备技术能力分析(上),AIOps 常见的误解(中),挑战及建议(下). 前言 我大概是 5,6 年前开始接触 ITO ...