В последнее время я посещал соревнования по программированию. У него была проблема, которую я все еще обдумываю. Язык программирования не имеет значения, но я написал его на С++. Задача состояла в следующем:
Как вы уже знаете, Flatland находится в самолете. Нет города в Фландрии, i-й из этих городов находится в точке (xi, уг). В i-м городе проживают граждане. Король Флатленд решил разделить королевство между двумя его сыновьями. Он хочет построить стену в виде бесконечной прямой линии; каждый из части будут управляться одним из сыновей. Стена не может пройти через любой город. Чтобы избежать зависти между братьями, две части должны быть как можно ближе; формально, если a и b являются общее число граждан, проживающих в городах первого и вторая часть соответственно, значение | a - b | должны быть сведены к минимуму. Помогите королю найти оптимальное подразделение. Количество городов меньше чем 1000. И все координаты являются целыми числами. Вывод алгоритма должно быть целым числом минимальных | a-b |
Хорошо, если бы я знал направление линии, это будет очень простая задача - бинарный поиск:
Я не хочу код, мне нужны идеи, потому что у меня их нет. Если я поймаю идею, я могу написать код!
Я не знаю оптимального направления, но думаю, что его можно найти как-то. Так можно ли найти или решить эту задачу другим способом?
Пример, когда горизонтальная/вертикальная линия не является оптимальной:
1
\
\
2 \ 1