给出的数组显示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
请帮助我,因为我完全陷入了这个问题。
答案 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