帮助理解Google Code Jam 2011 Candy Splitting问题

时间:2011-05-09 11:13:06

标签: math binary

我正在参与谷歌代码堵塞。在此之前我想说我不希望任何人解决我“赢得”的问题,或类似的事情。我只是想要一些帮助来理解我已经完成的一轮中无法解决的问题。

以下是问题的链接,称为Candy Splitting。我不会在这里解释它,因为它是nosense,我不能比谷歌更好地解释它。

我想知道这个问题的一些“好”解决方案,例如,我已经下载了第一个英文解决方案,而且我看到代码只有30行!!!棒极了! (任何人都可以下载它,所以我认为说出来没问题:来自here的解决方案.callhimtom来自{{3}})。即使看着代码我也无法理解解决方案。 (我对Java的无知并没有帮助。)

谢谢!

1 个答案:

答案 0 :(得分:4)

Google自己提供有关问题和解决方案的讨论

请参阅此链接了解Candy Splitting问题:http://code.google.com/codejam/contest/dashboard?c=975485#s=a&a=2

基本上,糖果可以分为两个相等价值的堆(如Patrick的观点),如果

C[0] xor C[1] xor C[2] xor ... xor C[N] == 0.

一个这样的分割是除了一个之外的所有糖果值的总和。为了最大限度地提高一堆的价值,可以选择价值最低的糖果,然后把它堆成一堆。

为什么会这样?

我想到的方式是,根据定义,帕特里克的加法实际上等于xoring值。从问题的定义,我们想要

C[i] xor C[j] xor ... xor C[k] == C[x] xor C[y] xor ... xor C[z]

每边都有一些元素。

将RHS添加到LHS和RHS产量

C[i] xor C[j] xor ... xor C[k] xor C[x] xor C[y] xor ... xor C[z] == 0

由于使用自身xored值得0,并且xor运算的顺序不重要,因此RHS变为0。

LHS中的任何元素都可以移到右侧,并且相等仍然成立。选择最低值元素可以实现最佳分割。