问题可以在这里找到:
http://code.google.com/codejam/contest/dashboard?c=975485#s=p3
我不明白为什么
answer = no. of elements that are not in the correct position
例如,假设我必须对此数组进行排序:
3 1 2
所以我这样想:
Array: 3 1 2 1st: freeze 2 to sort 1 (take 2 hits) Array: 1 3 2 2nd: freeze 1 to sort 2 and 3 (take another 2 hits)
因此,我的答案是4,但正确答案是3 有人能澄清这个问题吗?
答案 0 :(得分:12)
他们解释的解决方案是始终只保留正确排序的项目。如果你为三个未分类的元素执行此操作,那么在第一次尝试之后,有1/6的机会对所有这些元素进行排序(即我们在一次击中后完成),有3/6的几率你对其中一个项目进行排序(和你一样)平均需要2次点击)和2/6几率不会被排序(你仍然需要与你开始时相同的组织计数)。这为您提供了一个简单的循环公式,在评估后,平均而言,您需要3次点击才能对3个未排序的项目进行排序。
您的策略提供错误结果这一事实意味着它不是最佳策略。
他们的解决方案不是唯一能够提供相同结果的解决方案,只是最简单的解决方案。另一种可能的方法是保存所有已排序的项目(如果有的话),加上一些未排序的项目。但条件是你没有持有的所有物品都必须能够在你放弃你所持有的物品的情况下才能到达正确的位置(换句话说,它们必须形成cycle(s) in排列)。
考虑以下示例:
1 3 2 5 6 4
有5个未分类的商品,因此Google的解决方案平均需要5次点击。
1
已排序,因此我们必须保留它。如果我们也持有5
,6
和4
,则剩余的项目(3
和2
)可以到达正确的位置。当我们这样做时,他们平均会在2次点击中到达那里。现在我们有3个未分类的项目,我们可以平均按3次点击对它们进行排序。 (我们必须保持所有这些都是自由的,因为它们形成一个循环。)因此,这种方法虽然更复杂,但与原始方法一样快。
答案 1 :(得分:5)
以下是做法" 3 1 2":
不要冻结任何东西,只需让所有3个元素随机重新洗牌。
你有 1/6的机会一次解决问题:1 2 3
最终有1个人在正确的位置和2个错误的家伙结束的机会:
1 3 2
3 2 1
2 1 3
2/6的机会最终导致所有3个人仍然错误:
2 3 1
3 1 2
考虑以3/3的概率退出3-bad状态为硬币翻转。平均需要多长时间才能成功?这是一个几何分布(谷歌那个),所以你平均需要3/2(1.5)翻转。现在假设你已经摆脱了糟糕的状态,你有1/4的概率被解决,概率3/4有2个错误的家伙。因此,平均而言,在退出不良状态或1.5步后,您需要执行0 * 1/4 + 2 * 3/4步骤。
(&#34;解决2个人乱序的步骤&#34;上述公式中的声明可以通过几何分布的预期值的另一个应用得到,p = 1/2。)< / p>
答案 2 :(得分:4)
结果证明:
让E[n]
成为无序的n个数字的预期点击次数。
如果n> = 2,E[n]
是一个加上一次点击后加权可能结果的总和,
`E[n] = 1+(E[1]*count[1]+E[2]*count[2]+...+E[n] * count[n])/n!`
现在我们必须计算count[k]
。它是
所以count[k] = C(n,k)*(k-1)!*(n-k)!=n!/k
。
然后我们可以写
E[n] = 1+E[1]/1+E[2]/2+...+E[n-1]/(n-1)+E[n]/n (a)
E[n-1] = 1+E[1]/1+E[2]/2+...+E[n-1]/(n-1) (b)
E[n]-E[n-1] = E[n]/n (a)-(b)
E[n]/n = E[n-1]/(n-1) (rearranging)
E[n-1]/(n-1) = E[n-2]/(n-2) (substituting)
...
E[3]/3 = E[2]/2 (substituting)
E[2]/2 = 1 (1/2+1/4+1/8+...)
E[n]=n
&gt; = n
被证明(btw E[1]
未定义且count[1]=0
)
所以这个问题的答案就是这些数字的数量不在他们正确的位置。
我已经在http://www.chaoswork.com/blog写了这一轮的解决方案,但是这个博客是用中文写的,所以在这里,我再用英文发表我的想法。
答案 3 :(得分:1)
我没有花时间去理解证明,但在comp期间,我曾尝试模拟不同'周期'的情况。随机生成2 [2,1]的循环的置换。它是100000次并分为平均值。大约是2.
所以我尝试了3 [2,3,1]的循环。随机置换,检查正确的位置,冻结它们,随机置换剩余(或者在较大的周期我刚刚添加了先前的模拟循环结果 - 即2周期增加了2.00)。
我在比赛期间尝试了很多东西,所以可能是草率的,但是我的模拟给出的数字不同于证据所暗示的数据。
周期3 - 3.5(而不是3) 周期4 - 5.25(而不是4) 周期5 - 6.4 ......(而不是5)
???
这有点奇怪吗?然后用这些数字我发现集合中的所有循环并添加了我找到的数字。显然这不像我的其他尝试那样不正确。