Algorithm 给定N个大理石和M个楼层,找到算法以找到大理石将从中断裂的最低楼层
这与这个问题有关: 但这是不一样的。。。 我们要找出最好的算法,找到最低楼层所需的最大落差的策略 这是我脑子里想的 最后一块大理石必须以逐步的方式掉落 其余的弹珠将选择一个跳跃(说hop-n) e、 所以当N=2,M=100时,我们知道最大压降=14 hop-1=第一块大理石第一次掉落的地板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 *
以下是用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 */