我在interviewStreet网上找到了一个谜题,并尝试按如下方式解决:
有一个无限的整数网格,N人有他们的房子.他们决定团结在一个共同的聚会场所,这是一个人的家.从任何给定的小区,所有8个相邻小区在1个单位时间内可达.例如:(x,y)可以在一个单位时间内从(x-1,y + 1)到达.找到一个共同的聚会场所,最大限度地减少所有人的旅行时间总和.
我首先想到的是及时编写n²复杂度的解决方案,但约束条件是
1 <= N <= 10 ^ 5并且输入中每个坐标的绝对值将至多为10 ^ 9
所以,我改变了我的第一种方法,而不是考虑距离和旅行时间的问题,我把不同的房子看作不同的身体,不同的重量.而不是计算所有距离,我寻找这组物体的重心.
这是我的"求解"函数的代码,vectorToTreat是一个lengthX2表,存储有关网格上各点的所有数据,结果是打印到stdout的数字:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是我通过了12个官方测试案例超过13个,我看不出我做错了什么想法?提前致谢.AE
Mar*_*coS 11
这个问题的关键是一组点的质心概念.会议地点是代表所有房屋的一组点的质心最近的房子.使用这种方法,您可以在线性时间内解决问题,即O(N).我在Python中完成了它,提交了我的解决方案并通过了所有测试.
但是,很容易构建质心方法不起作用的数据集.这是一个例子:
[(0, 0), (0, 1), (0, 2), (0, 3),
(1, 0), (1, 1), (1, 2), (1, 3),
(2, 0), (2, 1), (2, 2), (2, 3),
(3, 0), (3, 1), (3, 2), (3, 3),
(101, 101)]
Run Code Online (Sandbox Code Playgroud)
最好的解决方案是在(2,2)的房子里开会,费用是121(你可以通过详尽的搜索找到它 - O(N ^ 2)).但是,质心方法会产生不同的结果:
网站上的测试用例显然是以质心解决方案正常的方式塑造的,或者他们只是想知道你是否知道质心的概念.
我没有阅读您的代码,但请考虑以下示例:
重心位于(2,0),总行程时间最短为8,但最佳解决方案为(3,0),总行程时间最短为7.