传送门1(UVa): https://uva.onlinejudge.org/external/13/1354.pdf

传送门2(GOJ): http://acm.gdufe.edu.cn/Problem/read/id/1320

题意: 长度限制 r (1 < r < 10), 给 n (1 <= n <= 6) 个砝码,组成平衡(考虑重量和力臂)的天平,求天平最长能多长。

2015个人选拔赛#6 1004

比赛的时候完全不知道怎么做,比赛完两天重新看一遍有点思路就是敲不出来(弱渣...)=_=

跟着Wenjun师兄的代码学了一下

caodan的是最近在写多重for循环的时候总是在里层写错变量........找半天啊还好几个啊我这是怎么了................

二进制枚举,类似线段树从底层一层一层处理

#include <bits/stdc++.h>
using namespace std; struct Tree{
double l, r;
Tree(double ll = 0.0, double rr = 0.0): l(ll), r(rr) {}
}; const int MAXN = ;
int n;
bool vis[<<MAXN]; // 是否访问过该子集
double r, w[MAXN], sum[<<MAXN];
vector<Tree> tree[<<MAXN]; // 保存各子集符合题意的解 // 计算该子集包含的砝码个数,当为1时相当于到达二叉树结点
int count(int x){
int ans = ;
for(int i = ; i < n; ++i)
if(x & (<<i)) ++ans;
return ans;
} void dfs(int subset){
if(vis[subset]) return ;
vis[subset] = true;
if(count(subset) == ){
tree[subset].push_back(Tree());
return;
} //枚举该集合的所有子集
for(int left = (subset-) & subset; left; left = (left-) & subset){
int right = subset ^ left; //根据公式求当前左右集合对应力臂长度
double leftlen = sum[right] / sum[subset];
double rightlen = sum[left] / sum[subset];
dfs(left); dfs(right); for(int i = ; i < tree[left].size(); ++i){
for(int j = ; j < tree[right].size(); ++j){
double ll = max(tree[left][i].l + leftlen, tree[right][j].l - rightlen);
double rr = max(tree[right][j].r + rightlen, tree[left][i].r - leftlen);
if(ll + rr < r) tree[subset].push_back(Tree(ll, rr));
}
}
}
} int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%lf %d", &r, &n);
for(int i = ; i < n; ++i) scanf("%lf", &w[i]);
for(int i = ; i < (<<n); ++i){
sum[i] = ;
tree[i].clear();
for(int j = ; j < n; ++j){
if((i>>j) & ) sum[i] += w[j]; //二进制枚举各个子集的重量和
}
}
int root = (<<n) - ; //整个天平
memset(vis, false, sizeof(vis));
dfs(root);
double ans = -;
for(int i = ; i < tree[root].size(); ++i)
ans = max(ans, tree[root][i].l + tree[root][i].r);
if(ans == -) printf("-1\n");
else printf("%.15lf\n", ans);
}
return ;
}

UVa 1354 Mobile Computing | GOJ 1320 不加修饰的天平问题 (例题 7-7)的更多相关文章

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

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

  2. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  3. Uva 1354 Mobile Computing

    题目链接 题意: 在一个宽为r 的房间里, 有s个砝码, 每个天平的一端要么挂砝码, 要么挂另一个天平, 并且每个天平要保持平衡. 求使得所有砝码都放在天平上, 且总宽度不超过房间宽度的最大值. 思路 ...

  4. Mobile Computing: the Next Decade论文 cloudlet薄云

    1 Introduction “Information at your fingertips anywhere, anytime” has been the driving vision of mob ...

  5. UVa 1354 天平难题 Mobile Computing

    整个题考虑起来 最主要要计算的状态 是树的状态 于是要计算出所有可能挂坠可能组成的树的所有形态 tree 用于保存这些状态 考虑不要重复计算,有一个vis 数组 预处理可以先计算出一棵树的重量,简化计 ...

  6. UVa 1354 枚举子集 Mobile Computing

    只要枚举左右两个子天平砝码的集合,我们就能算出左右两个悬挂点到根悬挂点的距离. 但是题中要求找尽量宽的天平但是不能超过房间的宽度,想不到要怎样记录结果. 参考别人代码,用了一个结构体的vector,保 ...

  7. 【例题 7-7 UVA - 1354】Mobile Computing

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 秤砣都是在叶子节点. 可以把它看成一个二叉树. 则我们每次只需要选择任意两个"节点",让他们组成一棵二叉树就可以 ...

  8. UVa 536 Tree Recovery | GOJ 1077 Post-order (习题 6-3)

    传送门1: https://uva.onlinejudge.org/external/5/536.pdf 传送门2: http://acm.gdufe.edu.cn/Problem/read/id/1 ...

  9. UVa 1354 天平难题

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. window7环境下VMWare自定义安装Linux虚拟机完全教程

    1.首先准备好以下工具和安装包,最好到官网下载: VMWare 8.x,注意版本不易过高,因为很多时候会出现和Linux镜像不兼容的情况,下载地址:http://www.vmware.com/cn.h ...

  2. Django 同步数据库命令syncdb,makemigrations,migrate

    syncdb只支持新增模型到数据库中 2条命令 你将使用2条命令进行迁移和操纵数据库schema: migrate,用来使迁移生效,以及未生效时报告它们的状态. makemigrations,用来根据 ...

  3. CentOS 7 引导 -- GRUB2

    如果安装完 CentOS 7 之后,原来的 Windows 引导菜单被覆盖了,vi /boot/grub2/grub.cfg 添加如下代码: ## BEGIN WINDOWS 10 menuentry ...

  4. 带分页、过滤条件的DSL

    "query": { "bool": { "must_not": { "match_phrase": { "p ...

  5. scip学习

    最近在学习scip  准备把里面比较有价值的题分别用lisp和c语言写出来.这样或许能更加深入的理scheme的函数式编程. tip:我用的c语言环境是vs2015,lisp环境为Drracket;

  6. TODO:字节序的一些理解

    TODO:字节序的一些理解 本文是小编对字节序的片面理解,希望对你有帮助哈. 字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前. 1.Little endian:将低 ...

  7. Ajax实现页面动态加载,添加数据

    前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Products ...

  8. Java NIO Channel和Buffer

    Java NIO Channel和Buffer @author ixenos Channel和Buffer的关系 1.NIO速度的提高来自于所使用的结构更接近于OS执行I/O的方式:通道和缓冲器: 2 ...

  9. 什么是Bash Shell的内建(build in)命令

    1.什么是build in命令: shell内建命令是指bash(或其它版本)工具集中的命令.一般都会有一个与之同名的系统命令,比如bash中的echo命令与/bin/echo是两个不同的命令,尽管他 ...

  10. Jquery实现双击表单元格可编辑

    <script type="text/javascript"> function doTableTdEditClick(param){ doTdEditable(par ...