【发布时间】:2011-08-24 05:52:09
【问题描述】:
我在interviewStreet网上找到了一个谜题,尝试解决如下:
有一个无限整数网格,N 个人的房子在上面。他们决定 在一个共同的聚会地点团结起来,那是某人的房子。从任何给定的单元格,所有 8 相邻小区可在 1 个单位时间内到达。例如:(x,y) 可以从 (x-1,y+1) 到达 在一个单位时间内。找到一个公共的聚会地点,使总和最小化 所有人的旅行时间。
我首先想到的是及时写一个 n² 复杂度的解决方案,但限制是
1
所以,我改变了我的第一种方法,不再关注距离和旅行时间的问题,而是将不同的房屋视为具有不同重量的不同物体。我不是计算所有距离,而是寻找这组物体的重心。
这是我的“解决”函数的代码,vectorToTreat 是一个 lengthX2 表,存储有关网格上点的所有数据,resul 是要打印到标准输出的数字:
long long solve(long long** vectorToTreat, int length){
long long resul = 0;
int i;
long long x=0;
long long y=0;
int tmpCur=-1;
long long tmp=-1;
for(i=0;i<length;i++){
x+=vectorToTreat[i][0];
y+=vectorToTreat[i][1];
}
x=x/length;
y=y/length;
tmp = max(absol(vectorToTreat[0][0]-x),absol(vectorToTreat[0][1]-y));
tmpCur = 0;
for(i=1;i<length;i++){
if(max(absol(vectorToTreat[i][0]-x),absol(vectorToTreat[i][1]-y))<tmp){
tmp = max(absol(vectorToTreat[i][0]-x),absol(vectorToTreat[i][1]-y));
tmpCur = i;
}
}
for(i=0;i<length;i++){
if(i!=tmpCur)
resul += max(absol(vectorToTreat[i][0]-vectorToTreat[tmpCur][0]),absol(vectorToTreat[i][1]-vectorToTreat[tmpCur][1]));
}
return resul;
}
现在的问题是我通过了 12 个官方测试用例超过 13 个,我看不出我做错了什么,有什么想法吗? 提前致谢。 自动曝光
【问题讨论】:
-
问题是重心和最小化总距离的点是不同的点。如果您试图找到后者,请不要编写找到前者的算法。
-
我不知道解决方案,但我建议尝试通过解决问题的更简单版本来获得一些见解。如果问题仅限于一维,则存在线性解决方案;找出解决方案,然后看看这是否有助于解决二维问题。
-
我猜你的解决方案解决了这个问题,当使用毕达哥拉斯计算到对角线单元的距离时。
-
每个单元格可以有多个房子吗?肉食点是被占用的牢房之一(房子)还是没有房子的空闲牢房,或者它没有发挥作用?您是否尝试找到平均 x 和 y 位置?你有这些的样本数据和解决方案吗?
-
大家好,感谢大家对这篇文章的评论。 @Eric Lippert,重心与最小化总距离的点完全不同,但在我的代码中,找到重心后,我会寻找最近的点并说:这是解决方案点。