我遇到了这个问题:
一个旅游者有一张 M x N 的地图。在地图上放置了 k 个城市(k <= 2000)。城市的坐标为 (lin, col)(lin <= M 和 col <= N)。我们也知道旅游者的坐标。旅游者决定朝着某个方向走,并在地图的边缘停下。但他想走一条能让他经过尽可能多城市的路线。你需要计算他能够参观的最大城市数量。
M,N <= 1000 K <= 2000
例如:5 10(M 和 N) 3 2(旅游者的坐标) 7(城市数 k) 0 0(城市坐标) 0 8 1 6 2 2 2 4 3 7 4 5 答案:3 实际上,这个问题需要包括游客坐标的共线点的最大数量。
我已经找到了一个O(k^2)的解决方案。
一个旅游者有一张 M x N 的地图。在地图上放置了 k 个城市(k <= 2000)。城市的坐标为 (lin, col)(lin <= M 和 col <= N)。我们也知道旅游者的坐标。旅游者决定朝着某个方向走,并在地图的边缘停下。但他想走一条能让他经过尽可能多城市的路线。你需要计算他能够参观的最大城市数量。
M,N <= 1000 K <= 2000
例如:5 10(M 和 N) 3 2(旅游者的坐标) 7(城市数 k) 0 0(城市坐标) 0 8 1 6 2 2 2 4 3 7 4 5 答案:3 实际上,这个问题需要包括游客坐标的共线点的最大数量。
我已经找到了一个O(k^2)的解决方案。
for(i=0; i<k; i++) {
fscanf(fi, "%d%d", &lin[i], &col[i]);
lin[i]-=l; //we consider tourist's coordinates the origin
col[i]-=c;
}
for(i=0; i<k; i++) {
points=1;
for(j=0; j<k; j++) {
...
if(lin[i] * col[j] == lin[j] * col[i]) //verify collinearity
points++;
...
}
但我相信它可以比O(k^2)更好地完成。目前我还没有找到任何优化方法。