圈子中有n
个孩子。他们每个人都有一些糖果(可能是负数,正数或零)。他们可以一次给邻居一块糖果。最终结果是他们在最小步骤中都应该没有糖果。
假设我们有4个孩子用(-4, -2, 4, 2)
个糖果,那么序列将是
这是一个可能的答案,我必须找到最少的步骤。
循环1:查找邻居是否有正面糖果,然后将其交给带有负糖果的邻居,直到糖果数等于零,并添加给予总和的糖果数量。
循环2:查找邻居的邻居是否有正面糖果,然后将其交给带有负糖果的邻居,直到糖果数等于零并加2(给予总和的糖果数)。 / p>
依此类推。
我的解决方案的复杂性导致了TLE。我该怎么做才能降低复杂性?
答案 0 :(得分:7)
我认为你不需要详细循环。将每个地方的糖果数写为X1,X2,X3,X4。假设X1从左边接收k个糖果(即X4)。在此之后它有X1 + k糖果,所以必须将它传递到右边。然后X2将有X1 + X2 + k糖果,所以它必须将它传递到右边。然后X3将有X1 + X2 + X3 + k糖果,所以它必须将它传递给X4。我们知道X4通过了k糖果,这个检查(假设X1 + X2 + X3 + X4 = 0,如果没有,则没有解决方案)。
这需要| k | + | X1 + k | + | X1 + X2 + k | + | X1 + X2 + X3 + k |步骤,所以如果我们猜测k我们知道要采取多少步骤。 k的最佳价值是多少?如果我们增加k,如果有更多+ ve项X1 + X2 + ... k则增加总和,如果有更多-ve项则减少。因此,k的最佳值是其中正好一半的| k |,| X1 + k | ..是+ ve且正好是一半 - 因为如果不是这种情况我们可以增加或减少k来制作更好的事情 - 要选择的k的值是 - 中位数0,X1,X1 + X2,X1 + X2 + X3。
我已经为你的例子的n = 4案例说明了这一点,但我希望你可以从中找出一般n的答案。
答案 1 :(得分:4)
采取 mcdowella 的想法,并将其置于我的话语中(因为我需要一段时间才能理解它,请参阅here了解一下这个主题),使其看起来像如下。关键见解是:
这个实现如下:选择一个任意的子项开始(下图中的Child A,我有5个孩子而不是4个),我们选择一个任意方向(逆时针方向,在我们的例子中),并启动通过。每个孩子都必须摆脱所有的糖果(正面或负面)才能达到零。因此,孩子A有-2
糖果,所以我们将它传递给Child B.之后,孩子B有-5糖果,所以我们将它传递给孩子C.现在孩子C有-4糖果,然后传递给D,所以上。这是第二张图,所有糖果在13次移动中都为零。
senter图不是最佳的。我们观察到在中心图中传递的所有糖果都是负数(保存E-> A通过)并且我们可以在第一次通过时添加或减去:如果A-> B传递是+5
而不是-2
,然后所有传递将增加7
,并且E->传递将是7
而不是0,并且结束A仍然没有糖果。因此,我们寻找一个数字,通过该数字我们可以调整所有通过,使得所有通过的绝对值之和最小化。在上一个图中,我们看到如果我们向所有传递添加+2
,则所有传递的绝对值之和为7.作为一个例子,如果我们添加+3
,则总和会更大。因此,我们寻求为所有通道添加一个常量,以最小化所有通道的绝对值之和。
P.S。如果有人认为我的重新说明 mcdowella 的想法不应该在这里,我会很乐意删除。
答案 2 :(得分:1)
这里适用的一种元方法是采用一种轮询并使其基于事件的算法。我是什么意思?
维护一个循环链接列表,其中包含给予者(带有> 0个糖果的孩子)和接受者(带有< 0个糖果的孩子)。维护一个优先级队列,其中包含每个相邻(在列表中,而不是在圆圈中)的给予者对的条目,其关键是给予者和接受者之间的距离。
现在,不要一次增加一个距离,而是使用优先级队列来找出下一个有趣的事情。每次解析一个给予者时,一个或两个孩子都会退出列表,这需要O(1)簿记和队列插入。