UVA1354-Mobile Computing(二进制枚举子集)
Problem UVA1354-Mobile Computing
Accept:267 Submit:2232
Time Limit: 3000 mSec
Problem Description

Input

Output

Sample Input
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-)⊂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(二进制枚举子集)的更多相关文章
- 紫书 例题 11-3 UVa 1151 (有边集的最小生成树+二进制枚举子集)
标题指的边集是说这道题的套餐, 是由几条边构成的. 思路是先做一遍最小生成树排除边, 因为如果第一次做没有加入的边, 到后来新加入了很多权值为0的边,这些边肯定排在最前面,然后这条边的前面的那些边肯定 ...
- UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)
题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...
- BZOJ1688|二进制枚举子集| 状态压缩DP
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...
- 杭电多校第十场 hdu6435 CSGO 二进制枚举子集
CSGO Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Subm ...
- UVA 1151二进制枚举子集 + 最小生成树
题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...
- 南阳OJ-91-阶乘之和---二进制枚举(入门)
题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=91 题目大意: 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为 ...
- hdu1045 Fire Net---二进制枚举子集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意: 给你一幅n*n的图,再给你一些点,这些点的上下左右不能再放其他点,除非有墙('X') ...
- POJ 3279 Fliptile(反转 +二进制枚举)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13631 Accepted: 5027 Descrip ...
- UVa 1354 Mobile Computing[暴力枚举]
**1354 Mobile Computing** There is a mysterious planet called Yaen, whose space is 2-dimensional. Th ...
随机推荐
- 【Java每日一题】20170321
20170320问题解析请点击今日问题下方的“[Java每日一题]20170321”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...
- js 判断数组中是否有重复值
function arrHasvalue(arr) { var nary = arr.sort(); for (var i = 0; i < arr.length; i++) { if (nar ...
- js 中prototype运用(数组)
转自:http://www.cnblogs.com/chiname/articles/216517.html(侵删) /* * 方法:Array.removeAt(Index) * 功能 ...
- es6 语法 (数值扩展)
{ //二进制数值都是0b开头,八进制0o console.log(0b111110111) console.log(0o767); } { console.log('15',Number.isFin ...
- js的map遍历和array遍历
1. array遍历: [1].forEach() forEach是ES5中操作数组的一种方法,主要功能是遍历数组.forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第 ...
- django模型基础(三)
本文转载自https://blog.csdn.net/xiaogeldx/article/details/88084034 表关系 一对一(OneToOne) 通过本表的主键外键关联另一张表的主键 创 ...
- ambari 卸载脚本
#!/bin/bash # Program: # uninstall ambari automatic PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bi ...
- mysql中需要注意的编码问题
- 使用JDBC连接MySQL数据库的一个基本案例
JDBC的概念(摘自百度百科) JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一 ...
- svn基本常见操作设置
代码管理工具一开始用的确会有点懵,但是永久了就会发现都是那几下套路,记录下来 托管好了代码一般起冲突了还是想重新搞一下,有个万能的重置操作,那就是重新关联svn项目,以前有时更换地址也是,发现遇到很多 ...