来自HackerRank的飞机点数

时间:2013-10-07 22:41:12

标签: algorithm

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

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)

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

有人能否至少提供一个提示,以解决这个问题所需的一般知识体系?我解决了很多其他的HackerRank问题,但是这个问题无法取得任何进展。

1 个答案:

答案 0 :(得分:0)

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