Даны 4 массива, надо выбрать из каждого из них по одному числу x_i, чтобы разница между x_min и x_max (наиб. и наим. среди 4х выбранных элементов x_i) была минимальной. Если таких наборов несколько, можно использовать любой из них.
Сложности возникли не с реализацией, а с созданием алгоритма. Я хотел использовать жадный алгоритм, но не могу понять, как может помочь для получения ответа решение подзадач для двух массивов.
UPD : Написал алгоритм, работает верно, но не проходит по времени. Не из-за того-ли что я вынес поиск ближайшего элемента в отдельную функцию dist и вызываю ее потом по три раза на каждую группу?
int dist(const std::vector
int diff(const std::vector
}
Ответ
По идее, должна сработать следующая идея: вы просто обобщаете алгоритм для двух массивов на более общий случай.
Например, так:
Сортируете все массивы.
Проходитесь по первому массиву. Запоминаете текущий индекс 0 во всех 4 массивах.
На каждом шагу, продвигаете индекс в первом массиве, и находите ближайший элемент к нему во остальных массиве. Для этого вам придётся продвинуться вперёд в этих массивах. При этом вы получаете для каждого из массивов ближайший элемент к элементу первого массива.
На этом шаге мы ищем группу элементов с оптимальным расстоянием между ними, которая включает данный элемент первого массива
Это ещё не гарантирует, что мы нашли оптимум. Нам нужно перебрать 2^3 вариантов из { «ближайший снизу», «ближайший сверху» } для каждого из массивов, каждый из них может дать оптимум.
Находите расстояние между наибольшим и наименьшим из них. Сравниваете его с текущим максимумом и продвигаетесь дальше по первому массиву.
Мы проходимся по каждому из массивов один раз, общая асимптотика — сумма длин массивов.
Комментариев нет:
Отправить комментарий