挖掘地牢的数字


10

编辑:在问题结束时,我将为奖金难题的第一个求解器颁发100信誉的赏金

我只会在答案出现时才将赏金添加到问题中,因为该赏金没有截止日期。

给定一个非递减的一位正整数列表,您应该确定这些位数将挖掘多深的地牢。

███  ███  A dungeon with 5 blocks removed and a depth of 3.
███  ███
███ ████
████████

在开始挖掘之前,地面是水平的。

每个手指都可以从其下方精确地移除一个土块,但是它必须从地牢外部到达该位置,并且在移除后必须离开地牢。这样做时,数字在任何水平步长处的下降或上升都不能超过其数值

数字使用以下策略进行挖掘:

  • 值最小的数字首先挖掘,然后,下一个挖掘器始终是其余数字中的下一个最小值。
  • 第一位数字可以在任何位置挖掘。(所有地面都相同。)
  • 下面的数字总是在最左边的已经开始的列上挖掘,它们可以出来。如果不存在这样的列,他们将在最右边的列的右侧开始挖掘一个新列。

例如,数字1 1 1 2 3 3将挖出下面的地牢(逐步可视化,并用数字标记该位置挖出哪种数字):

███1████    ███11███    ███11███    ███11███    ███11███    ███11███
████████    ████████    ███1████    ███1████    ███1████    ███13███
████████    ████████    ████████    ███2████    ███2████    ███2████
████████    ████████    ████████    ████████    ███3████    ███3████
████████    ████████    ████████    ████████    ████████    ████████

示例说明:

  • 如果第二个1将其加深到2-deep,以便它正确地挖掘出来,则它不能爬出唯一可用的列。
  • 第三个1可以在最左边的列中挖掘,从而创建一个2-deep列,因为它可以移至1-deep列,然后移至地面。
  • 下一个23两个都可以在最左边的列中挖掘。
  • 最后一个3不能在最左边的列中挖掘,而可以在下一个列中挖掘。

输入值

  • 带有至少一个元素的一位数正整数的非递减列表。

输出量

  • 单个正整数,表示所构造地牢的深度。

例子

输入=>输出(以地牢从左到右的深度作为解释,这不是输出的一部分)

[3]  =>  1
(column depths are [1])

[1, 1, 1, 2, 3, 3]  =>  4
(column depths are [4, 2])

[1, 1, 1, 1, 1, 1, 1, 1]  =>  3
(column depths are [3, 2, 2, 1])

[1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5]  =>  11
(column depths are [11, 6, 2])

[1, 1, 1, 1, 1, 2, 2, 9, 9, 9]  =>  7
(column depths are [7, 2, 1])

[2, 2, 2, 2, 2, 5, 5, 5, 7, 7, 9]  =>  9
(column depths are [9, 2])

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]  =>  10
(column depths are [10, 5])

[1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9]  =>  13
(column depths are [13, 5])

[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]  =>  13
(column depths are [13, 5])

[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9]  =>  21
(column depths are [21, 12, 3])

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

奖金难题

您能否证明(或反对)“数字使用以下挖掘策略”一节中描述的策略始终为给定的数字提供最深的地牢?

Answers:


5

Pyth,21个字节

huXf>+H@GhT@GT0G1Qm0Q

在线试用:单一演示测试套件

说明:

                  m0Q   generate a list of zeros of length len(input)
                        This will simulate the current depths
 u               Qm0Q   reduce G, starting with G=[0,...,0], for H in input():
   f          0             find the first number T >= 0, which satisfies:
    >+H@GhT@GT                  H + G[T+1] > G[T]
  X            G1           increase the depth at this position by one
                            update G with this result
h                       print the first element in this list

2

爪哇岛199

import java.util.*;a->{List<Integer>l=new ArrayList();l.add(0);int x,y,z=0;s:for(int i:a){for(x=0;x<z;x++)if((y=l.get(x))-l.get(x+1)<i){l.set(x,l.get(x)+1);continue s;}l.add(z++,1);}return l.get(0);}

扩展的可运行版本

import java.util.*;
class DIGits {
    public static void main(String[] args) {
        java.util.function.Function<int[], Integer> f =
                a->{
                    List<Integer> l = new ArrayList();
                    l.add(0);
                    int x, y, z = 0;
                    s:
                    for (int i : a) {
                        for (x = 0; x < z; x++) {
                            if ((y = l.get(x)) - l.get(x + 1) < i) {
                                l.set(x, l.get(x) + 1);
                                continue s;
                            }
                        }
                        l.add(z++, 1);
                    }
                    return l.get(0);
                };
        System.out.println(f.apply(new int[]{1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9}));
    }
}
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.