如何根据某些条件绘制线条?

时间:2019-05-08 04:39:09

标签: c++ algorithm

我正在解决一个编码问题,并且遇到了这个问题。它指出 : 我们有一个无限的平面直角坐标系,上面绘制了N个点。我用(Xi,Yi)表示的点的直角坐标。 现在我们要绘制(N-1)条线段,这些线段可以具有任意长度,并且点不必位于线上。每条线的斜率必须为1或-1。

让我们表示我们从点I到Di到达一条线所要经过的最小距离,比方说a = max(D1, D2, D3,..., DN)。我们希望该距离尽可能短。

因此,我们必须以最小化“ a”的方式绘制线条并计算a * sqrt(2)

约束:
1 <= T <= 100
2 <= N <= 10^4
|Xi|, |Yi| <= 10^9 for each valid i

T表示测试用例数。

样品输入1:
N = 3
点:(0,0),(0,1),(0,-1)

样本输出1:
0.5
说明:我们应该画出由等式yx + 0.5 = 0和yx-0.5 = 0表示的线

样品输入2:
N = 3
点:(0,1),(1,0),(-1,0)

样品输出2:
0
说明:我们应该画出由等式y−x−1 = 0和y + x-1 = 0构成的线

输出格式: 对于每个测试用例,打印一行包含一个实数的行-最小距离a乘以sqrt(2)。如果您的答案的绝对或相对误差不超过10 ^(-6),将被认为是正确的。

时间限制:1秒

我的理解是,当斜率为1或-1时,线的方程将为y = x + c或y = -x + c,我们只需要找到y截距c即可最小化距离'a在问题上。同样,从点到线的最小距离是垂直于线的长度。 因此,我很难设计一种算法来检查'c'的所有可能值并找到最佳值。

1 个答案:

答案 0 :(得分:1)

让我们将M[i]标记为(x[i], y[i])

第一步是计算点M(x, y)与直线D之间的距离,该点的斜率等于+/-1

让我们用DD'来表示行
D: y + x + c = 0
D': y - x + c = 0

然后,通过一些计算可以证明

  • MD之间的距离等于d(M, D) = abs(y + x + c)/sqrt(2)
  • MD'之间的距离等于d(M, D') = abs(y - x + c)/sqrt(2)

现在让我们考虑两个不同的点,例如M[0]M[1],让我们计算这两个点与参数{{1}的线D之间的最小距离}和斜率c

在形式上,我们有两个发现+/-1和斜率上的最小值
c

如果斜率是max(d(M[0], D), d(M[1], D)),即方程式是-1,则可以很容易地看出最优y+x+c=0参数等于

c

对应的距离等于c = -(x0 + y0 + x1 + y1)/2

如果斜率是abs(x0+y0-x1-y1)/(2*sqrt(2)),即方程式是1,则可以证明最优y-x+c=0参数等于

c

对应的距离等于c = (x0 - y0 + x1 - y1)/2

因此,从这两个点到最优线的最小距离是前两个距离的最小距离。

这将为每个点abs(y0 - x0 - y1 + x1)/(2*sqrt(2))定义以下数量:

  • M[i]
  • a|i] = y[i] - x[i]

然后将点b[i] = y[i] + x[i]M[i]之间的距离定义为:

M[j]

提出的算法在于找到对d(M[i], M[j]) = min (abs(b[i]-b[j]), abs(a[i]-a[j])),以使该距离最小。

然后所需的结果等于该距离的一半。

这对应于认为一条线将通过 distant 点(根据定义的距离),除了两个最接近的点之外,我们将在这两个点之间画一条线。

(编辑)

复杂度不是前面提到的O(n ^ 2)。
找到(M[i], M[j])的最小值的复杂度为O(N logN)。
这是通过对d(M[i], M[j])进行排序并获得相邻值之间的差的最小值(即a[i])来实现的。
然后,对min(a[i+1] - a[i])执行相同的操作,最后取两个获得的值中的最小值。