我正在解决一个编码问题,并且遇到了这个问题。它指出 : 我们有一个无限的平面直角坐标系,上面绘制了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'的所有可能值并找到最佳值。
答案 0 :(得分:1)
让我们将M[i]
标记为(x[i], y[i])
第一步是计算点M(x, y)
与直线D
之间的距离,该点的斜率等于+/-1
。
让我们用D
和D'
来表示行
D: y + x + c = 0
D': y - x + c = 0
然后,通过一些计算可以证明
M
和D
之间的距离等于d(M, D) = abs(y + x + c)/sqrt(2)
M
和D'
之间的距离等于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])
执行相同的操作,最后取两个获得的值中的最小值。