煎饼分类是一个数学问题的通俗术语,即当可以将抹刀插入堆叠中的任意点并用来翻转其上方的所有煎饼时,按大小顺序对无序的煎饼堆叠进行分类的数学问题。煎饼数P(n)是n个煎饼所需的最小翻转次数。1个
1979年,年轻的比尔·盖茨(Bill Gates)和克里斯托斯(Christos Papadimitriou)撰写了一篇论文,证明P(n)=(5n + 5)/ 3的上限。2
我认为可以肯定的是,盖茨(和/或帕帕第米特里奥)编写了一个程序,使用他们开发的算法(可能晚于1979年)执行煎饼分类。由于盖茨是一位熟练的程序员,因此他们可能会尽可能地尝试编写此代码,但是源代码的大小尚未公开(AFAIK)。
挑战:
创建一个执行煎饼分类的函数/程序,最大翻转次数不超过盖茨和帕帕第米特里乌找到的界限。3您可以选择是要列表递增还是递减,只要它是一致的即可。
您可以假设n <50。因此,您必须将翻转次数限制为(一些随机选择的n值):
n P(n)
38 65
49 83
50 85
输出应该是每次翻转之前刮刀的位置。输出可能是零索引或一个索引,您可以选择从顶部还是底部进行计数。
附加规则:
- 运行时必须是确定性的
- 没有固定的时间限制,但是您必须能够提供包含50个元素的列表的输出
测试清单:
我无法提供最困难的列表(如果是的话,我会写一篇论文,而不是挑战),所以我将提供一些随机数字列表,您可以在这些数字上测试函数/程序。如果事实证明这些列表“容易”,我可能会添加其他人。
9, 63, 62, 75, 45, 78, 59, 75, 69, 3, 28, 94, 51, 10, 45, 93, 97, 80, 72, 36, 80, 88, 30, 93, 84, 80, 17, 31, 6, 80, 76, 91, 9, 76, 38, 33, 22, 15, 45, 46, 15, 98, 2, 56, 90, 27, 27, 26, 69, 25
...
74, 89, 57, 52, 70, 96, 16, 5, 77, 84, 54, 13, 90, 64, 31, 80, 3, 25, 13, 19, 13, 34, 1, 79, 35, 43, 4, 19, 82, 29, 48, 95, 97, 28, 45, 62, 64, 82, 70, 34, 38, 15, 51, 83, 21, 66, 4, 42, 74, 84
...
62, 73, 7, 90, 83, 18, 12, 35, 72, 71, 99, 67, 87, 62, 65, 70, 14, 72, 55, 92, 87, 3, 7, 4, 4, 95, 49, 25, 4, 18, 49, 39, 26, 1, 45, 64, 23, 66, 39, 17, 33, 24, 58, 72, 77, 46, 99, 71, 10, 21
希望Bill Gates和Papadimitriou将看到这一挑战,并提供他们的代码,以便我们可以确定您是否确实超越了他们。
3已找到更好的上限,但是您不必关心那些上限。