找到两点之间的最大距离

时间:2012-09-08 07:12:09

标签: algorithm recursion dynamic-programming greedy number-theory

昨天,我出现在一次采访中。我陷入了其中一个问题,我在这里问的是同样的问题。

给出的数组显示x轴上的点,有N个点。和M币也给了。

Remember N >= M

你必须最大化任意两点之间的最小距离。

Example: Array : 1 3 6 12
         3 coins are given.
         If you put coins on 1, 3, 6 points Then distance between coins are : 2, 3 
         So it gives 2 as answer 
         But we can improve further
         If we put coins at 1, 6, 12 points.
         Then distances are 5, 6
         So correct answer is : 5

请帮助我,因为我完全陷入了这个问题。

3 个答案:

答案 0 :(得分:1)

这是我的 O(N 2 方法。首先,生成所有可能的距离;

int dist[1000000][3], ndist = 0;
for(int i = 0; i < n; i ++) {
    for(int j = i + 1; j < n; j ++) {
        dist[ndist][0] = abs(points[i] - points[j]);
        dist[ndist][1] = i; //save the first point
        dist[ndist][2] = j; //save the second point
    }
}

现在按递减顺序对距离进行排序:

sort(dist, dist + ndist, cmp);

cmp的位置:

bool cmp(int x[], int y[]) {
    return (x[0] > y[0]);
}

扫描数组,只要没有选择m点就添加点数:

int chosen = 0;
int ans;
for(int i = 0; i < ndist; i ++) {
    int whatadd = (!visited[dist[i][1]]) + (!visited[dist[i][2]); //how many new points we'll get if we take this one
    if(chosen + whatadd > m) {
        break;
    }
    visited[dist[i][1]] = 1;
    visited[dist[i][2]] = 1;
    chosen += whatadd;
    ans = dist[i][0]; //ans is the last dist[i][0] chosen, since they're sorted in decreasing order
}
if(chosen != m) {
    //you need at most one extra point, choose the optimal available one
    //left as an exercise :)
}

我希望有所帮助!

答案 1 :(得分:0)

您可以使用gready算法:您选择有序系列的第一个和最后一个点(因为这是最大可能距离)。然后选择最接近它们平均值的点(因为任何其他答案将在一侧给出较小的距离),而不是选择较大的分区。然后根据需要重复多次。

答案 2 :(得分:-1)

您必须使用动态编程。因为,您需要一个最佳答案。 您的问题类似于&#34; 硬币的变更&#34;问题。就像这个问题一样,你没有硬币而你想要找到最小距离。(而不是最少的硬币)。

您可以阅读以下链接:Change Coin problem&amp; Dynamic Programming