最近我开始解决在线评委的问题。我被困在this question in SPOJ:
这是一种改组N卡的算法:
- 卡片被分成K个等桩,其中K是N的因子。
- 底部N / K卡以相同的顺序属于桩1(因此.initial桩的底卡是桩1的底卡)。
- 底部的下一张N / K卡属于桩2,依此类推。
- 现在洗牌堆的顶牌是堆1的顶牌。下一张牌是堆2的顶牌,......,洗牌的Kth牌是堆K的顶牌。然后(K + 1)卡是现在位于桩1顶部的卡,(K + 2)nd是现在位于桩2顶部的卡,依此类推。
醇>例如,如果N = 6且K = 3,则在洗牌一次时,一副牌“ABCDEF”(从上到下)的顺序将变为“ECAFDB”。
给定N和K,在将桩恢复到原始顺序之后所需的最小洗牌次数是多少?
我尝试过模拟,但超出了时间限制。有没有数学方程?
答案 0 :(得分:1)
是的,这个问题有一个数学解决方案。
首先让我先介绍一下如何解决这些问题的技巧,然后我将提供一些实际解决方案的提示。我不会完成它,所以还有一些挑战。
那么:如何解决这些问题?你所做的实际上是一个好的开始。编写一个模拟并针对一些小案例运行它。那里的模拟应该相当快。现在你有了更多的价值观。把它们写在一张纸上,然后开始盯着它们。如果K = x 1 并且N = y 1 ,那么结果是z 1 以及更多这样的对。试着想出一些公式。专注于具有x,y或z的固定值的三元组。他们有什么共同点?等等。你盯着看,通常在一段时间后你会得到一个好主意:)
现在:关于这个特殊问题的一些提示。对洗牌进行一次迭代并记下每张卡的位置。例如,卡1进入位置3,卡3进入位置2,依此类推。注意,一些链将以这种方式形成 - 例如在示例中n = 6,k = 3,我们具有长度为6的链:1-> 3-> 2-> 6-> 4-> ; 5→1。现在计算所有链的长度(每个卡将完全属于一个链)并尝试找出答案如何依赖于这些长度。
希望这足以帮助您解决问题。
编辑:看一下模拟甚至单次迭代的约束可能会非常慢。如果是这种情况,在你完成我在第二个提示中的建议后,尝试计算链的长度,而不必实际模拟一个洗牌