如何修复不可能的Osmos级别?

时间:2013-05-07 09:52:42

标签: algorithm

我在Google Code Jam中看到了此optimisation problem。 (比赛结束了,所以可以谈谈。)

  

Armin正在玩Osmos,这是一款由Hemisphere Games开发的基于物理的益智游戏。在这个游戏中,他扮演一个“微尘”,四处移动并吸收较小的元素。

     

英语中的“mote”是一个小粒子。在这个游戏中,它是吸收(或吸收)其他东西的东西!这个问题的游戏与Osmos有类似的想法,但并不认为你玩过游戏。

     

当Armin的微尘吸收较小的微尘时,他的微尘会因较小的微尘尺寸而变得更大。现在它更大了,它可能能够吸收更多的微粒。例如:假设Armin的mote尺寸为10,并且还有其他尺寸为9,13和19的微粒。首先,Armin的微尘只能吸收尺寸为9的微尘。当它吸收时,它的尺寸为19。然后它只能吸收13号的微尘。当它吸收它时,它的大小为32.现在Armin的微尘可以吸收最后一个微尘。

     

请注意,当且仅当另一个微尘较小时,Armin的微尘可以吸收另一个微尘。如果另一个微粒与他的尺寸相同,那么他的微尘就无法吸收它。

     

你负责为Armin吸收创造微粒的程序。该程序已经创建了一些不同大小的微粒,并创造了Armin的微尘。不幸的是,考虑到他的微尘尺寸和其他微粒的清单,Armin的微尘可能无法全部吸收它们。

     

你想解决这个问题。您可以按任意顺序,任意次数执行两种操作:您可以为游戏添加任何正整数大小的微尘,或者您可以删除任何一个现有的微粒。为了使Armin的微尘可以吸收其他所有的微尘,你可以执行这些操作的最少次数是多少?

     

例如,假设Armin的mote大小为10,其他小节的大小为[9,20,25,100]。这个游戏目前无法解决,但通过添加尺寸为3的微尘并移除尺寸为100的微尘,您可以在仅2次操作中解决它。这里的答案是2。

如何解决? (请用散文解释,而不是含糊不清的代码)


我认为“给定一个可行的解决方案,删除一个mote大小x并添加一个更大的mote大小y,有一个优越的(至少同样好的)可行解决方案,其中添加的所有节点都小于删除的所有节点” (而不是删除mote尺寸x,在较大的mote尺寸y之后吃掉它)

这表明了一种快速算法。将微粒从最小到最大排序。吃。如果卡住,记录'删除其余'作为潜在的解决方案。添加大小player - 1的大小,直到大到足以吃掉我们坚持使用的微尘。重复。记录最终的“仅限添加”解决方案。在记录的内容中选择最佳解决方案。

我实施了this algorithm in Python。我很确定我的代码正确地实现了我的算法。我猜我的算法错了吗?

2 个答案:

答案 0 :(得分:2)

我认为您的问题出现在代码中:

# Let's add motes until we can eat it.
while A <= m:
  A += A-1
  operations += 1

这样可以模拟添加更多的元素,直到你足够吃掉当前的元素,然后再不吃它。

换句话说,我认为您需要将其更改为:

while A <= m:
  A += A-1
  operations += 1
A+=m

反映当你吃现有食物时的成长。

答案 1 :(得分:0)

将微粒从最小到最大排序。吃。如果坚持添加一个额外的尺寸currentMoteSize - 1,直到大到足以吃掉我们坚持的微尘。如果添加的extraMotes数量>&gt; =剩余微粒数量,则返回到目前为止计算的操作数量+剩余模式数量,否则如果添加的extraMotes数量为&gt; =然后返回总节点数,然后吃thent mote,添加额外节目的数量到目前为止计算的操作次数。重复,直到我们吃完所有的东西。返回计算的操作数