一组数字中最高的塔


20

编辑:问题结尾的赏金难题。

给定一组1位数字,您应该确定它们可以建造多高的塔。

这些数字生活在一个水平的平面上,可以站立。没有数字希望与多位数字混淆,因此它们的两边总是有空白。

4 2  1 9  6  8

一个数字可以位于另一个数字之上:

2
6

或可以由它下面的对角线另外两个支撑:

 9
5 8

底部的重量必须支撑上部的重量(如果有),再加上上部的重量始终为1。如果有两个支撑物,它们将鞋帮的总重量平均分配(50%-50%)。

每个数字的权重都是1,与它的值无关。

如果一个数字支持另外两个数字,则它必须能够支持其相应权重的总和。一个数字最多可以支持其数值。

一些有效的塔(有高度435):

            0          
7           1
5    1     1 1         9 supports a total weight of 1.5 = (1+1/2)/2 + (1+1/2)/2
2   5 4    5 5        
3  5 9 5  5 6 3        6 supports a total weight of 3 =  1.5 + 1.5 = (2*1+(2*1/2))/2 + (2*1+(2*1/2))/2

一些无效的塔:

1         5           The problems with the towers are (from left to right):
1  12    2 3     8      1 can't support 1+1; no space between 1 and 2;
1  5 6  1 1 1   9       1 can't support 1.5 = (1+1/2)/2 + (1+1/2)/2; 8 isn't properly supported (digits at both bottom diagonals or exactly below the 8)    

您应该编写一个程序或函数,该程序或函数给出一个数字列表作为输入输出,或者返回通过使用这些数字中的某些(也许是全部)可构建的最高塔的高度。

输入值

  • 包含至少一个元素的非负一位数字的列表。

输出量

  • 单个正整数,即最高可建造塔的高度。
  • 您的解决方案必须在一分钟之内在我的计算机上解决任何示例测试用例(我将仅测试关闭的用例。我的PC低于平均水平。)。

例子

格式Input list => Output number在接下来的几行中有可能的塔,这不是输出的一部分。

[0]  =>  1

0

[0, 1, 1, 1, 1, 1]  =>  3

  0
  1
 1 1

[1, 1, 1, 1, 1, 2, 2]  =>  4

   1
   1
  1 1
 1 2 2

[0, 0, 2, 2, 2, 2, 2, 5, 5, 5, 7, 7, 9]  =>  9

0
2
2
5
5
5
7
7
9

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]  =>  9

   1
   2
   2
   3
   4
   5
  3 3
 4 4 4
5 5 5 5

[0, 0, 0, 0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9]  =>  11

   0
   1
   2
   3
   4
   5
  3 3
  4 5
  5 5
 3 7 3
2 7 9 2

[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]  =>  12

 0
 1
 2
 3
 4
 5
 6
 7
4 5
6 7
8 8
9 9

[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9]  =>  18

      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
     5 5
     6 6
     7 7
    4 8 4
   3 7 7 3
  2 6 8 6 2
 2 5 8 8 5 2
 3 9 9 9 9 3

这是代码高尔夫球,因此最短的条目将获胜。

赏金

我将为解决以下多项式时间扩展问题(关于输入列表的长度)或证明不可能(假设P!= NP)而授予100个声望赏金(与已经获得的赏金无关)。扩展问题的详细信息:

  • 输入数字可以是任何非负整数,而不仅仅是数字
  • 多位数字与单位数字占据相同的位置
  • 多位数字可以支持它们的数值,例如24可以支持24

赏金优惠没有有效期限。如果出现证明,我将添加并奖励赏金。


1
您有足够的钱购买新PC吗?然后我有一个解决方案:P
ThreeFx 2015年

1
你的3-2-5-7塔使我困惑。您说“最底层的人必须支撑上层人的体重(如果有),再加上上层人的体重始终为1”,这与您说数字最多可以支撑的矛盾'其数值'-如果每个数字的权重为1,那么具有不同数字的意义何在?
MI Wright

3
@MIWright数字表示您可以在数字上堆叠多少重量。但重数量本身始终为1
马丁安德

@MartinBüttner哦,du。谢谢。
MI Wright

标题提到了几数字,但是考虑到这些示例,它看起来像是在意清单。集不能重复。
Grimmy

Answers:


10

Python 2-326

尽管我确实牺牲了一些效率,但在给出的所有示例的时间限制下都可以轻松运行,这在大量输入的情况下可能会很明显。现在,我考虑了一下,由于只允许一个数字,所以最大的可能塔可能不是很大,我想知道最大数是多少。

def S(u,c=0,w=[]):
 for(s,e)in[(len(w),lambda w,i:w[i]),(len(w)+1,lambda w,i:.5*sum(([0]+w+[0])[i:i+2]))]:
    m=u[:];l=[-1]*s
    for n in u:
     for i in range(s):
        if 0>l[i]and n>=e(w,i):m.remove(n);l[i]=n;break
    if([]==l or-1in l)==0:
     for r in S(m,c+1,[1+e(w,i)for i in range(s)]):yield r
 yield c
print max(S(sorted(input())))

2
像最大高度长相为18
凯尔古利恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.