1. 整个题考虑起来 最主要要计算的状态 是树的状态 于是要计算出所有可能挂坠可能组成的树的所有形态 tree 用于保存这些状态
  2.  
  3. 考虑不要重复计算,有一个vis 数组
  4.  
  5. 预处理可以先计算出一棵树的重量,简化计算
  6.  
  7. #include<stdio.h>
  8. #include<iostream>
  9. #include<vector>
  10. #include<algorithm>
  11.  
  12. using namespace std;
  13. const int maxn=6;
  14. int w[6];//各个重量
  15. int sum[1<<maxn]; //储存在i集合树的情况下总重量
  16. int n,s;
  17. double r;
  18. int vis[1<<maxn];//探究当前组成的树是否被构造过
  19.  
  20. struct Tree{
  21. double r,l;
  22. Tree(): r(0),l(0){
  23. }
  24. };
  25. vector<Tree>tree[1<<maxn];//下标的树组成的全部可能形态
  26. void dfs(int root){ //计算以root 组成一棵树的所有可能形态,并标记已记录
  27. if(vis[root])return;
  28. vis[root]=true;
  29. bool ok=false;
  30. for(int left=root&(root-1);left;left=(left-1)&root){
  31. int right=left^root;
  32. ok=true;
  33. dfs(left);
  34. dfs(right);
  35. double d1=(sum[left]*1.0)/(sum[root]*1.0);
  36. double d2=(sum[right]*1.0)/(sum[root]*1.0);
  37. for(int i=0;i<tree[left].size();i++){
  38. for(int j=0;j<tree[right].size();j++){
  39. Tree t;
  40. t.l=max(tree[left][i].l+d1,tree[right][j].l-d2);
  41. t.r=max(tree[left][i].r-d2,tree[right][j].r+d2);
  42. if(t.l+t.r<r)tree[root].push_back(t);
  43. }
  44. }
  45. }
  46. if(!ok)tree[root].push_back(Tree());//如果当前树只有一个挂坠,那么这是一个空树
  47. }
  48. int main()
  49. {
  50. freopen("t.in","r",stdin);
  51. freopen("t.out","w",stdout);
  52. cin>>n;
  53. while(n--){
  54. cin>>r>>s;
  55. for(int i=0;i<s;i++){
  56. cin>>w[i];
  57.  
  58. }
  59. for(int i=0;i< 1<<s;i++){
  60. vis[i]=false;
  61. tree[i].clear();
  62. sum[i]=0;
  63. for(int j=0;j<s;j++){
  64. if(i&(1<<j))sum[i]+=w[j];
  65. }
  66. }//存储重量的预处理 利用一个二进制数存储了所有的信息;
  67. int root=(1<<s)-1;
  68. dfs(root);
  69. long double ans=-1;
  70. for(int i=0;i<tree[root].size();i++){
  71. if(tree[root][i].l+tree[root][i].r>ans)ans=tree[root][i].l+tree[root][i].r;
  72. }
  73. cout<<ans<<endl;
  74. }
  75. }  

UVa 1354 天平难题 Mobile Computing的更多相关文章

  1. UVa 1354 天平难题

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

  2. UVa 1354 枚举子集 Mobile Computing

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

  3. UVa 1354 天平难题 (枚举二叉树)

    题意: 分析: 其实刚看到这题的时候觉得很难, 以至于结束了第七章然后去做了一遍第六章树的部分.现在再做这题觉得思路并不是太难,因为总共就只有六个结点,那么只要枚举二叉树然后算出天平然后再从叶子往上推 ...

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

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

  5. UVA.839 Not so Mobile ( 二叉树 DFS)

    UVA.839 Not so Mobile ( 二叉树 DFS) 题意分析 给出一份天平,判断天平是否平衡. 一开始使用的是保存每个节点,节点存储着两边的质量和距离,但是一直是Runtime erro ...

  6. UVa 839 -- Not so Mobile(树的递归输入)

    UVa 839 Not so Mobile(树的递归输入) 判断一个树状天平是否平衡,每个测试样例每行4个数 wl,dl,wr,dr,当wl*dl=wr*dr时,视为这个天平平衡,当wl或wr等于0是 ...

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

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

  8. 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 ...

  9. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

随机推荐

  1. OAF_开发系列29_实现OAF中批次处理迭代器RowSet/RowSetIterator(案例)

    20150814 Created By BaoXinjian

  2. STL中list和vector在添加元素时push_back会调用拷贝构造函数

    #include <iostream> #include <list> #include <vector> #include <cstring> usi ...

  3. linux中终端控制键Ctrl+C,Ctrl+Z,Ctrl+D的使用场合

    1.Ctrl+C比较暴力,就是发送Terminal到当前的程序,比如你正在运行一个查找功能,文件正在查找中,Ctrl+C就会强制结束当前的这个进程.2.Ctrl+Z是把当前的程序挂起,暂停执行这个程序 ...

  4. redis中setbit的用法

    原文地址:http://www.zhihu.com/question/27672245 在redis中,存储的字符串都是以二级制的进行存在的.举例:设置一个 key-value ,键的名字叫“andy ...

  5. Xcode磁盘空间大清理

    我的设备是Macbook Air 13' Mid 2011,128G SSD.最近开始有些存储压力了,用Clean My Mac清理一部分旧文件后,决定对Xcode动手. 移除对旧设备的支持 影响:可 ...

  6. SSH in Python

    需要安装paramiko,paramiko需要PyCrypto , PyCrypto 需要GCC编译. 安装PyCrypto: 安装Mingw32,确认环境变量. 下载并编译PyCrypto - se ...

  7. C语言读写文件

    对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数: 字符读写函数  :fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:freed和fwrite 格式 ...

  8. Linux下的文件与目录操作 BY 四喜三顺

      文件操作权限: chmod 三个八进制数字 文件名 其中:三个八进制数字,第一个代表本用户的权限,第二个代表同组的权限,第三个代表其他用户的权限4代表可读2代表可写1代表可执行例如:chmod 7 ...

  9. log level

    ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF

  10. 向架构师进军-->可重用架构资源

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 软件架构有三个主要来源:拿取.方法以及直觉.拿取也就是可重用资源.对于一个标准的系统 ...