2

我一直在努力解决这个问题好几天了,没有取得任何进展:

https://www.hackerrank.com/challenges/points-in-a-plane

我尝试了一个贪婪的详尽解决方案,在每对点之间画一条线,然后根据它们交叉的点数开始按降序消除这些线。不幸的是,至少在一种情况下,这种方法会产生次优结果:

为了便于讨论,我将根据它们包含的点数将它们称为“更长”或“更短”。贪心算法只是按照长度递减的顺序消除线条。

假设我们有一组 N 个较长的行,以及另一组 M 个较短的行。我们的贪心算法将首先消除长线。但是,如果长线的每一个点都包含在短线中呢?在这种情况下,我们最初消除 N 条较长的行是一种浪费,因为如果我们只是消除了较短的行,我们就会“免费”获得这些行。具体来说,我们的贪心方法将需要 N + M 次消除,我们可以在 M 步内清除所有点。

演示这一点的最简单示例输入是:

(0, 1), (1, 2), (2, 4), (3, 3)
(0, 0), (1, 0), (2, 0), (3, 0)
(0,-1), (1,-2), (2,-4), (3,-3)

如您所见,我们有一条长度为 4 的线沿 X 轴延伸,还有 4 条长度为 3 的较短线垂直于它。我们的贪心算法会先剔除最长的线,之后会剩下8组点,共线的不超过2组。因此,消除这些将需要 4 个步骤,总共 5 个。如果我们只是从较短的垂直线开始,我们可以分 4 个步骤消除所有点。

有人可以至少提供解决此问题所需的一般知识体系的提示吗?我解决了许多其他 HackerRank 问题,但在这个问题上没有取得任何进展。

4

1 回答 1

0

在下文中,使用k是表示给定线中的点数。k正如您在反例中正确指出的那样,您建议的通过减少值来删除行的贪婪算法是不正确的。相反,尝试通过减少 来排序k * (n-k) + \binom{k, 2},其中n是剩余的点数。T如果您使用它,您将始终找到解决方案第一部分所要求的最小匝数。证明这一点相对容易,我把它留作练习。

于 2013-10-18T09:37:32.397 回答