Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 给定N个大理石和M个楼层,找到算法以找到大理石将从中断裂的最低楼层_Algorithm_Puzzle - Fatal编程技术网

Algorithm 给定N个大理石和M个楼层,找到算法以找到大理石将从中断裂的最低楼层

Algorithm 给定N个大理石和M个楼层,找到算法以找到大理石将从中断裂的最低楼层,algorithm,puzzle,Algorithm,Puzzle,这与这个问题有关: 但这是不一样的。。。 我们要找出最好的算法,找到最低楼层所需的最大落差的策略 这是我脑子里想的 最后一块大理石必须以逐步的方式掉落 其余的弹珠将选择一个跳跃(说hop-n) e、 所以当N=2,M=100时,我们知道最大压降=14 hop-1=第一块大理石第一次掉落的地板 以下是用Java编写的简单暴力解决方案: /** * Return maximum number of floors that could be checked with given number *

这与这个问题有关: 但这是不一样的。。。 我们要找出最好的算法,找到最低楼层所需的最大落差的策略

这是我脑子里想的

最后一块大理石必须以逐步的方式掉落

其余的弹珠将选择一个跳跃(说hop-n)

e、 所以当N=2,M=100时,我们知道最大压降=14 hop-1=第一块大理石第一次掉落的地板


以下是用Java编写的简单暴力解决方案:

/**
 * Return maximum number of floors that could be checked with given number
 * of marbles and drops.
 */
private static int getMaximumFloors (int marblesCount, int dropsCount)
{
    if (marblesCount == 0) return 0;
    else
    {
        int result = 0;

        for (int i = 0; i < dropsCount; i++)
        {
            result += getMaximumFloors (marblesCount - 1, i) + 1;
        }

        return result;
    }
}

/**
 * Return minimum number of drops that is definitely enough to check
 * given number of floors having given number of marbles.
 */
private static int getMinimumDrops (int marblesCount, int floorsCount)
{
    int dropsCount = 0;
    while (getMaximumFloors (marblesCount, dropsCount) < floorsCount)
        dropsCount += 1;
    return dropsCount;
}

public static void main (String [] args)
{
    System.out.println (getMinimumDrops (2, 100));
}

可使用M颗大理石和D颗水滴探测的F层数量为

F(0,D) = 0 /* no marbles, no results */
F(M,0) = 0 /* no drops, no results */

F(M,D) = 1 + /* we drop a marble once... */
    F(M-1,D-1) + /* it breaks ... */
    F(M,D-1) /* or it doesn't */

此函数与您想要计算的相反,但这不是问题。函数是单调的,所以只需在结果空间中进行二进制搜索。

这是一项数学任务,而不是开发任务,在此处发布答案可能会降低其他人的兴趣。您可能需要
std::find\u lower\u marble\u break\u floor
。哦,等等,C++对大理石问题一无所知。MikhailVladimirov:我没能找到你。你认为推导这个的算法是纯粹的数学工作吗?@Ajeet提出的观点是,这是一个数学/逻辑/算法问题,因此它主要关注实现问题或与代码相关的问题,因此它有点离题;你能为(2100)和(3100)分一杯羹吗。当然,答案中增加了复杂性。复杂性当然是不好的,因为这是蛮力。我认为将该算法简化为直接公式是一项很好的数学任务。至少对于一个和两个大理石来说,这很容易。作为对代码所做工作的解释:使用n个大理石和m个水滴可以探索的最大楼层数是
Sum[i1=1..m](Sum[i2=1..i1](…Sum[in=1..i(n-1)](in))
(n层总和)。该策略是针对第一个大理石,我们将从地面开始下落,通过在等式中设置i1=m,然后i1=m-1..m等计算,直到其断裂。随后的大理石也从更多的楼层跌落到更少的楼层,通过上面的公式计算,但从外层剥离。
F(0,D) = 0 /* no marbles, no results */
F(M,0) = 0 /* no drops, no results */

F(M,D) = 1 + /* we drop a marble once... */
    F(M-1,D-1) + /* it breaks ... */
    F(M,D-1) /* or it doesn't */