Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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 为什么我在下面的问题中只迭代到sqrt(N)?_Algorithm_Math - Fatal编程技术网

Algorithm 为什么我在下面的问题中只迭代到sqrt(N)?

Algorithm 为什么我在下面的问题中只迭代到sqrt(N)?,algorithm,math,Algorithm,Math,问题摘要 假设岛上有五个人和一只猴子。在 晚上,一个人醒来,把收集的椰子分成五堆 把他的那份藏起来。剩下的一个椰子给了孩子们 猴子 第二个人醒了,做了同样的事。分割后 他把椰子分成五堆,把自己的一份藏起来,剩下一个椰子给了他 猴子。第三个、第四个和第五个男人紧随其后 程序第二天早上,他们把剩下的椰子分成了四份 五等份。这次没有剩下椰子 如果我们知道收集到的椰子数量,结果是什么 可能在该区域的最大人数(和一只猴子) 如果发生相同的过程,请单击“孤岛” 请注意,以上是我个人的抽象概念。完整的问题是可

问题摘要

假设岛上有五个人和一只猴子。在 晚上,一个人醒来,把收集的椰子分成五堆 把他的那份藏起来。剩下的一个椰子给了孩子们 猴子

第二个人醒了,做了同样的事。分割后 他把椰子分成五堆,把自己的一份藏起来,剩下一个椰子给了他 猴子。第三个、第四个和第五个男人紧随其后 程序第二天早上,他们把剩下的椰子分成了四份 五等份。这次没有剩下椰子

如果我们知道收集到的椰子数量,结果是什么 可能在该区域的最大人数(和一只猴子) 如果发生相同的过程,请单击“孤岛”

请注意,以上是我个人的抽象概念。完整的问题是可用的

我的解决方案摘要

我将应用以下程序:(
N
是收集的椰子数量,
d
是在问题摘要中执行上述程序的最大人数)

  • 集合编号
    d=sqrt(N-1)+1

  • 给定数字
    d
    ,计算
    N-1
    ,并获得
    N
    的新值,该值可以使用以下公式得到:
    N=(N-1)/((N-1)/d)
    仅当
    (N-1)%d==0
    。重复计算此公式
    d

  • 如果在步骤2中,未满足条件
    (N-1)%d==0
    ,则设置编号
    d=d-1
    ,然后重复步骤2

  • 如果步骤2成功地重复了
    d
    次,请检查最后的
    N
    是否可被
    d
    整除,即
    N%d==0
    。如果是,则使用的编号
    d
    就是解决方案

  • 如果
    d==2
    仍然不是解决方案,则没有解决方案

  • 我的完整解决方案可用,并已被接受为答案

    问题


    为什么我只需要选择
    d
    sqrt(N-1)+1ceil(sqrt(N))?我如何知道超出
    ceil(sqrt(N))
    的数字不满足条件?背后的理论是什么?(我知道我只需要重复到
    ceil(sqrt(N))
    ,因为书上这么说。我尝试了一个解决方案,包括选择所有可能的
    d
    s,高于平方根阈值,但仍然小于
    N
    ,我得到了TLE[时限错误]。

    好的,原因很简单,这是程序固有的

    假设你有
    d=10
    人和
    m=1
    猴子

    最后一个醒来的人必须找到多少椰子才能得到他应得的那份?答案是
    d+m=11

    只有最后一个醒来的人才能找到多少椰子才能得到他应得的那份?现在,如果我们想得到准确的数字,答案就有点棘手了,但一般来说,答案至少必须是
    (d+m)+(d+m)=22=2*(d+m)
    ,这样最后一个才能在他之后得到公平的份额

    因为这是针对人数的,所以第一个人前面的乘系数必须是
    d

    因此
    N>=d*(d+m)
    ,对于
    m>0
    ,这也适用于
    N>=d*d

    现在你把
    sqrt()
    两面都拿出来,你就得到了答案。

    你不应该为这个问题链接到外部站点。请在quer问题中至少添加一个简化版本。@Smith42先生,我已经添加了问题的重要部分。也许你还应该说关于这个问题的
    d
    N
    。@norok2添加了信息。第三段和第四段的问题有什么区别?理查德:对不起,更正了,一个是最后一个人,另一个是最后一个人。好的,谢谢。我现在明白了。我有点好奇你是怎么想出这个理由的。阅读它让我明白了,但在得到解释之前思考如何做对我来说有点困难。我刚开始写下方程式,意识到整数约束更容易从下往上看。原则上,你可以从第一人称开始,得出一个类似的方程式,但要意识到你必须为每次迭代得到一个因子
    d
    ,这就不那么明确了。