Ограничения: время – 2s/4s, память – 256MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод
Послать решение Blockly Посылки Темы Где Обсудить (0)
Одной из основных задач компьютерного зрения является построение модели
скелета человека по данным, полученным от различных
устройств (RGB-камеры, IR-сенсора и т.д.). В большинстве случаев в качестве данных
используются карты глубин – структуры,
описывающие расстояния от устройства до точек сцены. В нашем случае карты глубин
представлены прямоугольными числовыми матрицами.
Каждый элемент матрицы (пиксел) соответствует некоторой точке в пространстве
сцены (в нашей задаче для простоты используется
ортогональная проекция на картинную плоскость), множество таких точек
будем называть облаком точек (см. рисунок). Облако точек,
представляющих человека в сцене, будем называть облаком точек человека.
Одним из методов скелетизации является метод Voxel Scooping. В ходе его применения
возникает следующая подзадача: необходимо разделить
облако точек человека набором плоскостей, параллельных картинной
таким образом, чтобы точки облака были наиболее равномерно
распределены в областях, порождаемых разбиением.
Итак, дана прямоугольная матрица размера `N` на `M` (`1\ ≤\ N\ ≤\ 50`, `1\ ≤\ M\ ≤\ 50`), элементы
матрицы – целые числа от 0 до 65535.
Ненулевые элементы матрицы – пиксели, задающие облако точек человека.
Требуется разделить облако точек человека не более
чем `K` (`1\ ≤\ K\ ≤\ 20`) вертикальными плоскостями таким образом,
чтобы сумма расстояний от каждой точки до ближайшей плоскости была
минимальной. В случае, если существует несколько оптимальных разделений,
необходимо выбрать то, которое содержит наименьшее количество
плоскостей. Если существует несколько вариантов с минимальным
количеством плоскостей, можно вывести любой из них.
Формат ввода
В первой строке ввода заданы числа `N`, `M` и `K`. Каждая из следующих `N` строк
содержит `M` целых чисел, задающих элементы матрицы.
Гарантируется, что матрица содержит хотя бы один ненулевой элемент.
Формат вывода
В первой строке вывести одно вещественное число – минимальное значение суммы
расстояний с точностью не менее `10^{-6}`.
Во второй строке вывести целое число `q` (`1\ ≤\ q\ ≤\ K`) – количество вертикальных плоскостей, входящих в оптимальное разбиение.
В третьей строке вывести `q` чисел через пробел – глубины разделяющих плоскостей в оптимальном разбиении с 9 десятичными знаками после точки.
Пример ввода
28 18 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 4 3 3 2 3 4 0 0 0 0 0 0
0 0 0 0 4 4 3 3 2 2 3 3 4 4 0 0 0 0
0 0 0 4 2 2 2 2 2 2 2 2 2 2 4 0 0 0
0 0 2 2 2 2 1 2 2 2 2 2 2 2 2 2 0 0
0 0 2 2 0 0 1 2 2 1 1 1 0 0 0 2 0 0
0 0 2 2 0 0 1 1 1 1 1 1 0 0 2 2 0 0
0 0 0 2 0 0 1 1 1 1 1 1 0 0 2 2 0 0
0 0 0 1 0 0 1 1 1 1 1 1 0 0 2 0 0 0
0 0 0 0 1 1 1 1 3 3 1 1 0 2 2 0 0 0
0 0 0 0 0 0 1 3 3 3 3 1 0 1 2 0 0 0
0 0 0 0 0 0 3 3 3 3 3 3 0 1 0 0 0 0
0 0 0 0 0 0 3 3 3 3 3 3 3 0 0 0 0 0
0 0 0 0 0 0 3 3 3 0 3 3 3 0 0 0 0 0
0 0 0 0 0 3 3 3 3 0 3 3 3 0 0 0 0 0
0 0 0 0 0 3 4 3 0 0 3 4 4 0 0 0 0 0
0 0 0 0 0 4 4 4 0 0 4 4 4 0 0 0 0 0
0 0 0 0 0 4 4 4 0 0 0 4 4 4 0 0 0 0
0 0 0 0 0 4 4 0 0 0 0 4 4 4 0 0 0 0
0 0 0 0 0 4 4 0 0 0 0 4 4 4 0 0 0 0
0 0 0 0 4 4 4 0 0 0 0 0 4 4 0 0 0 0
0 0 0 0 4 4 0 0 0 0 0 0 0 4 4 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Пример вывода
84.000000
2
1.500000000 3.500000000