Algorithm 2010年ACM问题的解决方案:城堡

Algorithm 2010年ACM问题的解决方案:城堡,algorithm,Algorithm,发布您的最佳解决方案!您可以在此处找到完整的问题描述和示例: 你有一套由公路连接的城堡,你想用最少的士兵数量征服所有的城堡。每座城堡都有三个属性:夺取城堡所需的最少士兵数量、夺取城堡死亡的士兵数量以及必须留下来守住城堡的士兵数量 任何两座城堡之间只有一条路(道路形成一棵树)。你可以选择任何一座城堡作为第一个目标,但之后你必须沿着道路前进。一条路你只能走两次。你的机动部队必须保持在一个小组中。我可以这样解决: 暴力强制所有起始城堡(最多100个) 对于每个起始城堡: 填充数组 需要[i]和成本[i

发布您的最佳解决方案!您可以在此处找到完整的问题描述和示例:

你有一套由公路连接的城堡,你想用最少的士兵数量征服所有的城堡。每座城堡都有三个属性:夺取城堡所需的最少士兵数量、夺取城堡死亡的士兵数量以及必须留下来守住城堡的士兵数量


任何两座城堡之间只有一条路(道路形成一棵树)。你可以选择任何一座城堡作为第一个目标,但之后你必须沿着道路前进。一条路你只能走两次。你的机动部队必须保持在一个小组中。

我可以这样解决:

暴力强制所有起始城堡(最多100个) 对于每个起始城堡: 填充数组

需要[i]和成本[i]意味着,当你从选择的起点到i,并试图从i开始计算子树时,你至少需要[i]焊料,而成本[i]焊料将死亡

min_-Wedder_-to_-attack_castle[i]来自输入文件

显然,“终端”城堡的需求[]和成本[]值是显而易见的。 然后,对于已知所有“孩子”的需求[]和成本[]值的每个城堡,您可以通过以下方式计算该城堡的需求和成本:

成本[i]=总和(成本[子女])


获取需求[i]是一个棘手的部分:我们知道它介于max(最小焊锡到攻击城堡[所有孩子])和max(最小焊锡到攻击城堡[所有孩子])和max(成本[所有孩子])之间。尝试所有的变种会花费我们(孩子的数量)!而且可能是n!,也许优化会对这里有所帮助,这就是我现在停下来的地方。

我会反过来解决这个问题-你想让尽可能少的人在占领最后一座城堡后“浪费”。既然我们不能通过一座城堡而不去占领它,我们显然会在一座“叶子”城堡结束

从所有的叶子城堡向后走,以确定每个子树上“浪费”的总人数,这是很简单的——然后只需按正确的顺序走子树


基本的,我亲爱的沃森。

首先要意识到的是,就数字而言,失去的士兵和留下的士兵没有区别。因此,我们可以减少城堡财产的士兵损失和需要

要意识到的第二件事是,如果你沿着一根树枝往下走,你必须完成整根树枝才能返回。这使我们能够将整个分支机构缩减为一个“巨型城堡”,需要和损失的总兵力

因此,假设我们可以计算分支的成本,我们剩下两个问题:从哪里开始,以及如何选择首先下降哪个分支。我只是想强行进入首发位置,但可能会做得更好。选择要下降的分支有点困难。失踪士兵的人数微不足道,但所需的人数却不是。有n个!可能性,所以我们不能全部尝试

我不再考虑每个城堡需要多少士兵,而是要倒回去。从0名士兵开始,在你攻击城堡时添加他们,确保我们至少得到所需数量。有两种情况:要么有一座我们满足要求的城堡,要么没有。如果有,(联合国)做那个城堡(这是最佳的,因为我们使用了最少的士兵数量)。如果没有,请添加一个额外的士兵并重试(这是最佳选择,因为我们必须添加一个士兵才能继续)。现在,它应该变得显而易见:我们希望(联合国)做城堡的要求最接近的数字丢失第一。只需按(必需减去丢失)排序,这就是您的顺序

最后的算法如下所示:

  • 暴力是起点
  • 递归地将分支减少为聚合城堡(对于其他起点,记住此结果)
  • 按降序(必需减去丢失)访问分支机构
运行时间是O(n*c^2*lg(c)),其中n是城堡的数量,c是任何单个城堡的最大连通性。这更糟糕,因为最多有nc“分支”,并且节点在其分支被求值后最多需要clg(c)时间进行求值。[由于记忆功能,分支和节点最多计算一次]


我认为可以做得更好,但我不确定如何做。

重要的是要知道城堡的最大数量是100座。第一个琐碎的观察是,你在每个城堡“损失”的士兵数量是死亡的士兵和你必须留下的士兵的总和——不管怎样,他们不会在拼图中扮演任何进一步的角色。你会用这个解决方案做什么?2月1日至6日在哈尔滨举行的决赛,2010@Hamish我不会对这个解决方案做任何事情,只是享受它!变型发生在星线城堡结构中。问题是找到正确的顺序,正如我在下面评论的,找到正确的顺序可能会花费你100英镑!操作;-)找到“正确的顺序”是相当简单的-你知道哪个子树需要最后遍历,然后把剩下的子树串在一起,这样你就可以从“最大损耗->最小损耗”遍历子树。一旦你确定了要首先遍历的子树,也就是说,你可以专注于这一子树来确定最佳的起始城堡。不,你错了:-)想象一下这种情况:子1:模具10,最小焊料计数到conqure 100,子2:模具20,最小焊料计数到conqure 200如果你先遍历子1,你将需要210个焊料,如果你先攻击儿童2,你只需要200个焊料。我的算法建议先攻击儿童2。我不明白你的意思。对不起,这个怎么样:1:模具10,最小焊料计数100 2:模具10,最小焊料计数100 3:模具1,最小焊料计数200没有理由强行改变起点。相反,找出你的终点,然后倒转过去找出最好的起点