如何将水果堆放整齐

How to stack fruit in a neat pile

我为这个案例选择了 Java,因为该语言非常简单,任何人都可以翻译。

用什么数学算法来确定在这样的模式中堆叠 X 数量的水果所需的水果数量? (忽略 2 的幂,我把它堆成一个正方形)

 *  1
 * 2 3          = 2
 *
 *  1 2
 * 3 4 5        = 3
 *
 *   1
 *  2 3
 * 4 5 6        = 3
 *
 *  1 2 3
 * 4 5 6 7      = 4
 *
 *   1 2
 *  3 4 5
 * 6 7 8 9      = 4
 *
 *    1
 *   2 3
 *  4 5 6
 * 7 8 9 X      = 4
 *
 *   1 2 3
 *  3 4 5 6
 * 7 8 9 X 1    = 5

最初我认为这很容易,但随着数字越来越高,我开始认为它更像是一个阶乘。

编辑:添加从@templatetypedef

下面提供的答案翻译而来的代码
private int _getBottomLineCount() {
    double insideSquareRoot = (8 * numberOfApples) +1;
    double squareRoot = Math.sqrt(insideSquareRoot);
    double val = (squareRoot -1) /2;

    return (int) Math.ceil(val); // Round it up to nearest whole number
}

高n的金字塔中水果的个数由第n个三角数给出,由方程

给出

Tn = n(n + 1) / 2

例如,高度为 2 的金字塔有 2(2 + 1) / 2 = 3 个水果。高度为 4 的金字塔可容纳 4(4 + 1) / 2 = 10 个水果。

如果你有 k 个水果要放入一叠,你正在寻找满足 Tn ≥ k 的最小数字 n。你可以直接解决这个问题:

Tn = k

n(n + 1) / 2 = k

n2 + n = 2k

n2 + n - 2k = 0

使用二次公式给出

n = (-1 ±√(1 + 8k)) / 2

这里的负根可以忽略,所以你的数n应该是

n = (√(8k + 1) - 1) / 2

这个数字可能不是整数,在这种情况下你想四舍五入。

让我们尝试一些例子。假设你有 9 个水果要堆叠。我们可以计算上面的公式得到

n = (√(72 + 1) - 1) / 2 = (√(73) - 1) / 2 = 3.772001873

四舍五入得到 k = 4,所以你需要一叠高度为 4 的纸。

假设您有 137 个水果要堆叠。同样的公式返回 n = 16.060495162,所以你需要一堆高度 17 来存储水果。

希望对您有所帮助!