Я нашел головоломку онлайн на interviewStreet и попытался решить ее следующим образом:
Существует бесконечная целая сетка, в которой у N людей есть свои дома. Они решают объединиться на общем собрании, где есть кто-то дом. Из любой данной ячейки все 8 смежные ячейки достижимы за 1 единицу времени. например: (x, y) можно получить из (x-1, y + 1) за одну единицу времени. Найдите общее место встречи, которое минимизирует сумму время поездки всех лиц.
Сначала я думал о написании решения со степенью сложности n², но ограничения
1 <= N <= 10 5 и абсолютное значение каждой координаты на входе будет составлять не более 10 ^ 9
Итак, я изменил свой первый подход и вместо того, чтобы смотреть на проблему с расстояниями и временем в пути, я смотрел на разные дома как на разные тела с разными весами. И вместо вычисления всех расстояний я ищу центр тяжести группы тел.
Здесь код моей "решающей" функции vectorToTreat - таблица lengспасибо2, в которой хранятся все данные о точках на сетке, а resul - это номер для печати в 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;
}
Проблема в том, что я прошел 12 официальных тестовых случаев более 13 лет, и я не вижу, что я делаю неправильно, какие-то идеи? Заранее спасибо. AE