题意:
     给出房间的宽度r和每个吊坠的重量wi,设计一个尽量宽但宽度不能超过房间宽度的天平,挂着所有挂坠,每个天平的一段要么挂这一个吊坠,要么挂着另一个天平,每个天平的总长度是1,细节我给出题目中的几个图来方便理解:

思路:
      敲了将近两个小时,数据比较小,也就是说只要找到解决方法,一般就可以直接AC了,首先我们可以搜索枚举天平的状态,就是总的天平的框架的样子,也就是二叉树的样子,这个地方卡了一会才想出来,我们可以直接枚举当天天平上有的点,每一步搜索是在当前天平上已有的点的叶子节点中两种决策,要么增加一个天平,要么不增加,在别的叶子节点上增加天平,总之当前这一步要在一个叶子节点上增加天平,(想想我们画二叉树的时候是不是这样画的),而且每增加一个天平就会在二叉树上增加一个挂坠的数量,一直增加到测试数据给的吊坠的数量,对于每一个枚举得到的二叉树,我们可以知道他一定是n个叶子节点的二叉树,然后我们用一个全排列(也可以写深搜,用全排列是为了不让代码太多,太乱)给这个叶子附上对应的重量,赋完重量之后我们可以再用深搜来给每个非叶子节点到他做儿子和有儿子的距离求出来,这个比较简单(不会可以直接看下面代码),求完距离之后可以用深搜遍历没一条路径,树根的坐标是0,然后往左就-,往右就+得到一个最大和最小的坐标,然后根据坐标差来更新最优值,这个题目我写了三个深搜,一个全排列AC的,感觉实现的有点麻烦,但不知道有没有更省事的,目前百度不到,还有就是有一个比较坑人的地方就是当吊坠只有一个的时候直接输出0,不是-1。

#include<stdio.h>
#include<string.h>
#include<algorithm>

#define N 3000

using namespace std;

typedef struct
{
   double ll ,rr ,ww;
   int mk;
}NODE;

NODE node[N];
int Now[N] ,n ,nn;
double num[10] ,r ,Ans;
double minn ,maxx;

double DFSlr(int now)
{
   if(node[now].mk) return node[now].ww;
   double lsum = DFSlr(now * 2);
   double rsum = DFSlr(now * 2 + 1);
   node[now].ll = rsum / (lsum + rsum);
   node[now].rr = lsum / (lsum + rsum);
   return lsum + rsum;
}

void DFSmm(double v ,int now)
{
   if(node[now].mk)
   {
      if(minn > v) minn = v;
      if(maxx < v) maxx = v;
      return;
   }
   DFSmm(v - node[now].ll ,now * 2);
   DFSmm(v + node[now].rr ,now * 2 + 1);
}

void DFS(int sw ,int sumnode)
{
   if(sw == n)
   {
      int tmpyz[10] ,nowid = 0;
      for(int i = 1 ;i <= sumnode ;i ++)
      if(node[Now[i]].mk) tmpyz[++nowid] = Now[i];
      for(int i = 1 ;i <= nn+1 ;i ++)
      {
         for(int j = 1 ;j <= n ;j ++)
         node[tmpyz[j]].ww = num[j];
         DFSlr(1);
         maxx = -100000 ,minn = 100000;
         DFSmm(0 ,1);
         if(maxx - minn <= r)
         {
            if(Ans < maxx - minn)
            Ans = maxx - minn;
         }        
         next_permutation(num + 1 ,num + n + 1);
       }
      return;
   }
   for(int i = 1 ;i <= sumnode ;i ++)
   {
      if(node[Now[i]].mk)
      {
        node[Now[i]].mk = 0;
        node[Now[i]*2].mk = 1;
        node[Now[i]*2+1].mk = 1;
        Now[sumnode+1] = Now[i]*2;
        Now[sumnode+2] = Now[i]*2+1;
        DFS(sw + 1 ,sumnode + 2);
        node[Now[i]].mk = 1;
        node[Now[i]*2].mk = 0;
        node[Now[i]*2+1].mk = 0;
      }
   }
}

int main ()
{
   int t ,i;
   scanf("%d" ,&t);
   while(t--)
   {
      scanf("%lf" ,&r);
      scanf("%d" ,&n);
      for(nn = i = 1 ;i <= n ;i ++)
      {
         scanf("%lf" ,&num[i]); 
         nn *= i;
      }
      if(n == 1)
      {
         printf("0\n");
         continue;
      }
      memset(node ,0 ,sizeof(node));
      Now[1] = 1 ,Ans = -1;
      node[1].mk = 1;
      DFS(1 ,1);
      printf("%.16lf\n" ,Ans);
   }
   return 0;
}

LA3403 天平难题相关推荐

  1. LA3403天平难题(4个DFS)

    题意:      给出房间的宽度r和每个吊坠的重量wi,设计一个尽量宽但宽度不能超过房间宽度的天平,挂着所有挂坠,每个天平的一段要么挂这一个吊坠,要么挂着另一个天平,每个天平的总长度是1,细节我给出题 ...

  2. UVA1354天平难题 枚举二叉树

    题意:给出房间宽度r和s个挂坠的重量wi.设计一个尽量宽(但宽度不能超过房间宽度r)的天平,挂着所有挂坠.天平由一些长度为1的木棍组成.木棍的每一端要么挂一个挂坠,要么挂另一个木棍,设n和m分别是两端 ...

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

    题意:给出房间宽度 r 和 s 个挂坠的重量 wi,设计一个尽量宽的天平,挂着所有挂坠.天平由一些长度为 1 的木棍组成,木棍的每一端要么挂一个挂坠,要么挂另外一个木棍. 这题卡了很久,看了很多大神的 ...

  4. 「程序员做饭指南」霸榜GitHub,还用数学公式解决「吃什么」世纪难题,微软程序员出品...

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 鱼羊 发自 凹非寺 量子位 | 公众号 QbitAI 我也是没想到啊,GayHub啊不 ...

  5. 数据结构题及c语言版答案9.14,十套数据结构试题+答案+难题解析(精校版)

    十套数据结构试题+答案+难题解析(精校版) 更新时间:2017/2/9 10:47:00  浏览量:643  手机版 数据结构试卷(一) 一.单选题(每题 2 分,共20分) 1. 栈和队列的共同特点 ...

  6. 【蓝桥java】进制与整除之天平秤重

    题目: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81 则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). ...

  7. [干货]Kaggle热门 | 用一个框架解决所有机器学习难题

    新智元推荐 来源:LinkedIn 作者:Abhishek Thakur 译者:弗格森 [新智元导读]本文是数据科学家Abhishek Thakur发表的Kaggle热门文章.作者总结了自己参加100 ...

  8. ZZULIOJ 1898: 985的数字难题 【水题】

    1898: 985的数字难题 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 243  Solved: 78 Description 985有n个数,已 ...

  9. 实现AI技术自立自强,国产深度学习框架面临三大难题

    作为推动AI应用大规模落地的关键力量,深度学习框架的重要性日益凸显.它不仅关系国计民生的行业和领域广泛的应用,同样也对信息系统的科技安全有着决定性的意义. "深度学习框架在人工智能技术体系中 ...

最新文章

  1. asp.net 2.0 权限树的控制
  2. 『原创』+『参考』使用C#在PPC的Today界面上的任务栏加入应用程序图标
  3. 在控制台中录入一个字符串 , 打印这个字符串中的字符以及出现的次数(Python)
  4. 多层图,dj+dp Gym 102501A Environment-Friendly
  5. 彻底理解mysql服务器的字符集转换问题
  6. filters获取data中的数据
  7. vue-router配置
  8. MySQL及其图形界面navicat的安装
  9. SpringBoot系列(8):SpringBoot中的MVC支持【组件型注解、请求和参数型注解】详解
  10. 选择排序(直接排序)
  11. 各国货币符号(Copy的)
  12. 一图看懂编程语言分类
  13. Eucalyptus(桉树)客户群体
  14. Mars 开源月报(2020.3)
  15. 空间相册显示服务器错误,空间相册服务器繁忙
  16. 关于BigDecimal.ROUND_HALF_UP与ROUND_HALF_DOWN
  17. linux终端安装playonlinux,Ubuntu安装PlayOnLinux的步骤
  18. IPv4首部详细解释
  19. AssetBundle(一)——AssetBundle介绍
  20. 时间序列的数据分析(七):数据平稳性

热门文章

  1. html5 css 万能的position大法
  2. 关于code reiview
  3. CString, BSTR, LPCTSTR之间得关系和区别
  4. oracle 的float(b)转
  5. 20172311《程序设计与数据结构》第八周学习总结
  6. SELinux 入门
  7. JSON返回DateTime/Date('123123123')/解决办法
  8. 移动端geolocation插件+百度地图js获取地址
  9. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(二)之Introduction to Objects...
  10. 提高你的Java代码质量吧:如果有必要,使用变长数组吧