Как применить троичный поиск для вызова SPOJ - KOPC12A
Я пытался решить проблему KOPC12A в SPOJ.
Ссылка на проблему: http://www.spoj.com/problems/KOPC12A/
Проблема вкратце:
Для n зданий, каждая из которых имеет разную высоту (количество кирпичей), а каждое здание имеет стоимость добавления или удаления кирпича, найдите минимальную стоимость, чтобы все здания имели одинаковую высоту.
После попытки решить эту проблему, хотя и тщетно, я наткнулся на решение, в котором использовался троичный поиск, после сортировки входных данных по их высоте.
Я не смог понять, как затраты на выравнивание высот зданий становятся унимодальными (поскольку троичный поиск может применяться только к унимодальным функциям)
Это поставило меня в тупик, и я не смог продвинуться дальше.
Любое понимание этого очень ценится.
Спасибо-
1 ответ
Чтобы расширить комментарий sashas, мы можем определить (сильную) унимодальность функции f
как условие
for all x < y < z, f(y) < max(f(x), f(z))
и (сильная) выпуклость функции f
как условие
z - y y - x
for all x < y < z, f(y) < ----- f(x) + ----- f(z).
z - x z - x
Пусть высота зданий будет h1, ..., hn
и стоимость изменения единицы будет c1, ..., cn
, Цена f(h')
сделать все здания высотой h'
является
sum i in {1, ..., n} of ci |h' - hi|.
Теперь вот последовательность предложений, каждое из которых имеет довольно простое доказательство, приводящее посредством индукции к выводу, что f
Унимодально
- Функция
g
гдеg(x) = |x|
выпуклый - Для всех констант
h
для всех выпуклых функцийg1
, функцияg2
гдеg2(x) = g1(x - h)
выпуклый - Для всех констант
c > 0
для всех выпуклых функцийg1
, функцияg2
гдеg2(x) = c g1(x)
выпуклый - Для всех выпуклых функций
g1
а такжеg2
, функцияg3
гдеg3(x) = g1(x) + g2(x)
выпуклый - Все выпуклые функции унимодальны.