Ответ @EvgenyKluev, похоже, идет в правильном направлении, но есть несколько тонкостей, которые я хотел бы задать.
Поскольку я не видел ограничение для x
будучи целого числа, вы можете пойти с бинарным поиском по x
вести свой алгоритм, и найти подходящие условия согласующих когда диапазон еще доступен для x
достаточно мал (вы бы сделать двоичный поиск для целого числа x
, но там вам не нужно условие завершения).
Размещение квадрата в одном углу прямоугольника (что-то, что вам нужно будет сделать, что достаточно просто доказать) ограничивает пространство поиска для размещения двух других квадратов: пусть A - это набор точек, охватываемых по выровненному по углу первому квадрату, и пусть S - множество всех точек. Возьмите S-A и найдите замкнутый прямоугольник этого набора точек. Размещение оставшихся двух квадратов в противоположных углах охватывающего прямоугольника S-A всегда будет решением (может быть только одна пара противоположных углов), если таковая существует.
Таким образом, один алгоритм может - очень высокий уровень - идти как этот
binary search for x on [0,N]:
find R(S), the enclosing rectangle of S
for each corner C of R(S):
align one square at C, let the points covered by that square be A
find R(S-A)
do two squares aligned at opposite corners of R(S-A) cover S-A?
Что касается двоичного поиска, я не могу сказать, как быстро, что будет сходиться к диапазону, что позволяет только одно выравнивание квадраты, в этот момент вы можете непосредственно вычислить значение x
- Я ожидаю, что с произвольной точностью вы можете сделать это произвольно плохо. Каждая итерация принимает O (n log n) для сортировки точек в обоих направлениях.
Возможно использовать какой-то алгоритм кластеризации, чтобы группировать точки в три кластера, а затем покрывать их по отдельности одним квадратом? –