SPOJ:卡洗牌

时间:2012-03-12 07:19:58

标签: algorithm math permutation

最近我开始解决在线评委的问题。我被困在this question in SPOJ

  

这是一种改组N卡的算法:

     
      
  1. 卡片被分成K个等桩,其中K是N的因子。
  2.   
  3. 底部N / K卡以相同的顺序属于桩1(因此.initial桩的底卡是桩1的底卡)。
  4.   
  5. 底部的下一张N / K卡属于桩2,依此类推。
  6.   
  7. 现在洗牌堆的顶牌是堆1的顶牌。下一张牌是堆2的顶牌,......,洗牌的Kth牌是堆K的顶牌。然后(K + 1)卡是现在位于桩1顶部的卡,(K + 2)nd是现在位于桩2顶部的卡,依此类推。
  8.         

    例如,如果N = 6且K = 3,则在洗牌一次时,一副牌“ABCDEF”(从上到下)的顺序将变为“ECAFDB”。

         

    给定N和K,在将桩恢复到原始顺序之后所需的最小洗牌次数是多少?


我尝试过模拟,但超出了时间限制。有没有数学方程?

1 个答案:

答案 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。现在计算所有链的长度(每个卡将完全属于一个链)并尝试找出答案如何依赖于这些长度。

希望这足以帮助您解决问题。

编辑:看一下模拟甚至单次迭代的约束可能会非常慢。如果是这种情况,在你完成我在第二个提示中的建议后,尝试计算链的长度,而不必实际模拟一个洗牌