LINUX.ORG.RU

Две задачки

 ,


0

1

Вот условия (на украинском языке):

https://docs.google.com/open?id=0B_k04ZnX_vvzUHc2aEtINWVxTjA https://docs.google.com/open?id=0B_k04ZnX_vvzd1BuRGx3anFnXzQ https://docs.google.com/open?id=0B_k04ZnX_vvzdkFtN2lfTjFjWjA

Сорри за качество.

Для Ъ:

1. Дано N шаров (N <= 100), заданных координатами центров и радиусами. Все координаты от 1 до 10000. Написать программу, которая найдет максимальное количество шаров, которые мы можем пересечь, проведя луч из (0; 0; 0).

2. Дано множество прямых (2 <= N <= 10) на плоскости, заданных координатами концов. Написать программу, находящую множество точек, от которых суммарное расстояние до прямых минимально. Вывести его минимальным количеством линейно связанных фигур (в примерах выведено в виде координат вершин этих самых фигур). Все числа в выводе представить в виде несократимых дробей.

Помогите!

Идеи, которые уже возникали:

Для задачи 1:

При помощи сферических координат свести задачу к поиску пересечения максимального количества кругов на плоскости, а потом найти ее решение методом сканирующей прямой. Слишком сложно в реализации, авторами явно подразумевалось гораздо более простое решение.

Для задачи 2 в голову приходили различные переборы разной степени оптимальности, но все это не катит, т.к. дает решение с некоторой степенью приближения.

Deleted

Последнее исправление: CYB3R (всего исправлений: 2)
Ответ на: комментарий от dn2010

И да, как только украинцу надо что-то решить, он забывает незалежность и самостийность и переходит на великоимперский.

Ага. А давайте устроим хохлосрач.

<trolface> Варіант рішення першої задачі:

1. Спроектуємо всі кулі на площини (xy), (xz) та (yz). Далі будемо розглядати площину (xy)

2. До всіх кіл (проекцій куль на площину) проведемо дотичні промені з точки (0, 0). Промені створять два кути AlphaXYi1 = arctg(Xi/Yi) - arcsin(Ri/sqrt(Xi^2 + Yi^2)) та AlphaXYi2 = arctg(Xi/Yi) + arcsin(Ri/sqrt(Xi^2 + Yi^2))

3. Таким чином для кожної кулі отримуємо дві пари сферичних координат. Через будь-яких два кола модна провести промінь, що їх перетинає, якщо відрізки, які утворують пари сферичних координат променів перетинаються. Наприклад для кола 1 та 2 if (AlphaXY11 <= AlphaXY21 <= AlphaXY12 OR AlphaXY11 <= AlphaXY22 <= AlphaXY12) == True.

4. І якщо повернутися до куль — через будь які кулі 'm' та 'n' можна провести промінь якщо виконується умова: (AlphaXYm1 <= AlphaXYn1 <= AlphaXYm2 OR AlphaXYm1 <= AlphaXYn2 <= AlphaXYm2) AND (AlphaXZm1 <= AlphaXZn1 <= AlphaXZm2 OR AlphaXZm1 <= AlphaXZn2 <= AlphaXZm2) AND (AlphaYZm1 <= AlphaYZn1 <= AlphaYZm2 OR AlphaYZm1 <= AlphaYZn2 <= AlphaYZm2)

5. Визначаємо для кожної кулі кількість куль з яким вона лежить на одному промені.

6. ????????

7. PROFIT!!! </trolface>

anonymous
()

относительно первой задачи тебе нужно взять все лучи касательные к шарам. Это границы интервалов внутри которых количество пересеченных шаров не меняется. Потом обойди все интервалы по кругу добавляя 1 или отнимая 1 в зависимости от того с какой стороны это касательная

vertexua ★★★★★
()
Ответ на: комментарий от auto12884835

количество будет равно максимальному количеству набора конусов, в котором каждый из конусов попарно пересекается со всеми другими из этого набора, так как при этом, из-за условия невогнутости конусов, всяко имеется одна и только одна область их всех одновременного взаимного пересечения, в которой и лежит этот луч.

да действвительно. Я почему-то вчера отмел это решение, хотя для R^2 именно его и думал :)

задача сводится к построению графа и поиску наиболее большого подграфа K_p. получается, что сложность O(N^3).

dikiy ★★☆☆☆
()
Ответ на: комментарий от Eddy_Em

Я же уже говорил в самом начале: первая задача решается просто при привлечении OpenGL или же велосипедостроении своего трассировщика.

ну opengl тут реально не при делах :) Все чистая математика.

dikiy ★★☆☆☆
()
Ответ на: комментарий от at

Если по шарам построить конусы и рассматривать коническое сечение (т.е. фактически тень от точечного источника света) то решение элементарное. Т.е. это пересечение эллипсов на плоскости.

во-первых не на плоскости,а на сфере. А чтобы сферу перевести в плоскость нужно выколоть точку одну, такую еще найти надо :)

проще таки действительно построить граф пересечений и искать в нем уже.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Я имел ввиду следующее: Считаем, что начало координат это источник света. Выбираем плоскость, которая находится за сферами относительно начала координат (т.е. гарантированно не пересекает сферы). Т.е. их координаты находятся в интервале 1 - 10000 это может быть плоскость с точкой (20000,0,0) , перпендикулярная вектору (1,0,0). (Сферы с радиусом большим 10000 исключаем из расчетов, т.е. луч в любом случае будет проходить через них). Строим тень шара на сферу, т.е. это будет срез построенного на шаре конуса с вершиной в начале координат. Второй этап: ищем совмещение теней на плоскости, т.е. пересечение эллипсов.

at ★★
()
Ответ на: комментарий от dikiy

поиску наиболее большого подграфа K_p. получается, что сложность O(N^3).

если имеется ввиду полный граф / клика, то можно линк на n^3?

anonymous
()
Ответ на: комментарий от anonymous

поиску наиболее большого подграфа K_p. получается, что сложность O(N^3).

если имеется ввиду полный граф / клика, то можно линк на n^3?

ну смотри - берем узел, берем все соседние с ним узлы, выбираем из матрицы смежности соответствующую подматрицу размерности p и считаем в ней единички, если получилось p^2 - то мы имеем дело с кликой.

ограничение сверху дает n^2 на каждую итерацию. Всего итераций очвидно <=n. Ну и получаем O(n^3). Скорее всего можно быстрее, но это уже не принципиально.

dikiy ★★☆☆☆
()
Ответ на: комментарий от at

Строим тень шара на сферу, т.е. это будет срез построенного на шаре конуса с вершиной в начале координат. Второй этап: ищем совмещение теней на плоскости, т.е. пересечение эллипсов.

я ж и говорю - надо выколость точку сначала. Потому что сфера не изоморфна плоскости. А вот проколотая сфера - изоморфна.

dikiy ★★☆☆☆
()
Ответ на: комментарий от beastie

первое — элементарно: векторная геометрия, растояние точки до прямой. выбор точек с растоянием меньше радиуса.

А поподробней? Если учесть, что задача состоит совсем не в том, что бы проверить какие шары пересекает данная прямая? Что, обратные задачи тоже на первом курсе решать учат? Или Вы предлагаете тупо перебирать бесконечное множество прямых? Я вот так вот сходу даже не знаю чего и сказать... надо описывать область пересечения проекции шаров, это нефига не тривиально.

AIv ★★★★★
()
Ответ на: комментарий от dikiy

проще таки действительно построить граф пересечений и искать в нем уже.

Легко проверить парные пересечения, только это не дает нефига - то, что три шара пересекаются попарно не означает что они пересекаются все вместе...

AIv ★★★★★
()
Ответ на: комментарий от AIv

Легко проверить парные пересечения, только это не дает нефига - то, что три шара пересекаются попарно не означает что они пересекаются все вместе...

вот черт. Вы меня запутали! Вчера я именно так и думал. Сегодня пришел какой-то анонимус и я забыл, что я думал вчера. А вот пришел ты, и я опять понял, что я думал правильно :)

dikiy ★★☆☆☆
()

По второй - а что, координаты отрезков задающих прямые целочисленные?

Вторую надо на бумашке решать. Пишем выражение для суммы расстояний от точки (x,y) до прямых (тривиально), потом ищем локальные минимумы, и все любовь. Будет система из скольких то уравнений. С несократимыми дробями все сложней - придется получать аналитически выражения для конечных результатов, и уже над ними думать... ну или заюзать CAS которая сама умеет тянуть дроби ере все выкладки+сама все и посчитает;-)

AIv ★★★★★
()
Ответ на: комментарий от dikiy

Надо придумать какой то эффективный способ описания области пересечения.

Это будет такая фигура, заданная «вершинами» (прямыми) и соединяющими их коническими поверхностями (для каждой поверхности держим шар, по которому она построена). Дальше строим все парные области, с ними проверяем все остальные шары и т.д. Для ускорения пожалуй то да, надо проверять не все шары а только те которые по парному графу пересекаются. Та область, которая возьмет больше всего шаров, и даст ответ по числу шаров.

AIv ★★★★★
()
Ответ на: комментарий от AIv

потом ищем локальные минимумы, и все любовь.

там возможна проблема, что локальных минимумов - континуум. Упрощает то, что множество минимумов выпукло (если я не ошибся, и целевая функция все таки не выпукла. Надо проверить на бумаге). но надо будет при нахождении минимума проверить как ведет себя градиент в окресности-

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от AIv

Для ускорения пожалуй то да, надо проверять не все шары а только те которые по парному графу пересекаются. Та область, которая возьмет больше всего шаров, и даст ответ по числу шаров.

ну если так в лоб, то все равно получается экспоненциальное время и Branch&Bounding :) Хотя для 100 шаров может и не критично будет.

dikiy ★★☆☆☆
()
Ответ на: комментарий от AIv

Дальше строим все парные области, с ними проверяем все остальные шары и т.д

тут то и проблема, области эти получаются трудно выражаемые аналитически.

то есть мы должны искать множество удовлетворяющее системе квадратных неравенств, то не есть тривиально.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

эээ... \prod\limits_{i=1}^{N-1} i - даже для 100 это очень большое число;-)

>>> reduce( long.__mul__, range(1,100), 1L )
933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000L

Так что только по графу...

AIv ★★★★★
()
Ответ на: комментарий от AIv

лучше просто найти все точки пересечения всех окружностей и для каждой такой точки назнать список индексов шаров в которых она лежит. Потом выбрать ту точку и которой список наиболее длинный.

только предварительно удалить все те окружности, которые не пересекают никакие другие, назначая всем точкам пересечения, лежащим внутри них соотв. индекс. А случай вложенных шаров надо еще обдумать. Вероятно просто натравить удаление рекурсивно.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

Если три шара попарно пересекаются, это не значит, что существует пересечение всех трех шаров.

Deleted
()
Ответ на: комментарий от AIv

даже для 100 это очень большое число;-)

Я знаю, но Branch&Bounding поможет.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

А не надо смотреть на это как на неравенства. Надо научится описывать область + добавлять в нее новый шар (получаем либо пустую область, либо новую область). С геометрической т.з. это не очень сложно, можно на бумашке написать все возможные случаи и их реализовать.

AIv ★★★★★
()
Ответ на: комментарий от AIv

А не надо смотреть на это как на неравенства. Надо научится описывать область + добавлять в нее новый шар (получаем либо пустую область, либо новую область).

описание области и есть система неравенств.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Аааа... Вы таки правы. Искомая прямая лежит в области, ограниченное пересечением нескольких шаров, те. вполне может являться границой пересечения двух шаров. Дальше просто -

1) ищем все такие прямые.

2) проверяем, сколько шаров протыкает каждая прямая и ищем максимум.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Вторую надо на бумашке решать. Пишем выражение для суммы расстояний от точки (x,y) до прямых (тривиально), потом ищем локальные минимумы, и все любовь. Будет система из скольких то уравнений. С несократимыми дробями все сложней - придется получать аналитически выражения для конечных результатов, и уже над ними думать... ну или заюзать CAS которая сама умеет тянуть дроби ере все выкладки+сама все и посчитает;-)

Прямые разобьют плоскость на много областей. В каждой формула для поиска суммы расстояний будет отличаться (ибо раскрытие модуля). Таким образом, нам придется решать задачу отдельно для каждой такой области.

Оставшаяся задача (найти множество минимумов функции от двух переменных, такое, чтобы все точки попадали в область, с которой мы работаем) - тоже не из простых (по крайней мере, аналитического решения ее я не знаю).

Deleted
()
Ответ на: комментарий от AIv

тут единственный трабл, который может возникнуть, если оптимальная точка - это именно точка. А значит мы ее не сможем просто так найти, если она число иррациональное.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Deleted

Прямые разобьют плоскость на много областей.

не факт. Ведь это не прямые, а отрезки. С отрезками сложнее.

(найти множество минимумов функции от двух переменных, такое, чтобы все точки попадали в область, с которой мы работаем) - тоже не из простых (по крайней мере, аналитического решения ее я не знаю).

а его и не существует, этого аналитического решения. смотри лучше мои первые посты. Там же все расписано.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

не факт. Ведь это не прямые, а отрезки. С отрезками сложнее.

Прямые, заданные координатами точек, на них лежащих.

n - кількість автострад, які надалі вважаємо прямими

Deleted
()
Ответ на: комментарий от AIv

N^3 и никаких графов, фигня в общем;-)

оно-то так - но остаются все таки две технические проблемы, которые очевидно решаемы, но все равно надо подизвратиться:

1) работать будем на плоскости -> нужен изоморфизм сферы на плоскость -> нужно выколость точку.

Можно взять любую точку, вычислить в какие она окружности входит, вычислить эту область и каким то образом выкинуть ее из дальнейшего поиска, потому что нам надо эту точку будет выколость, чтобы изоморфизм построить.

2) проблема вложенных окружностей. Там точек пересечения нет ни одной, но это не отменяет оптимальности области. Решаемо удалением таких окружностей с нанесений каких-то меток на окружности, которые были внутри.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Deleted

не факт. Ведь это не прямые, а отрезки. С отрезками сложнее.

Прямые, заданные координатами точек, на них лежащих.

ну тогда еще проще. Расстояние от точки до прямой - выпуклая функция. Сумма выпуклых функций - сама выпуклая функций. Бери leasqr из octave и радуйся.

dikiy ★★☆☆☆
()
Ответ на: комментарий от AIv

Искомая прямая лежит в области, ограниченное пересечением нескольких шаров, те. вполне может являться границой пересечения двух шаров.

Я бы даже сказал, что среди множества прямых, на которых достигается максимум пересечения шаров всегда можно выбрать такую, которая является касательной к какому-то шару. Осталось только перебрать все прямые, итого сложность первой задачи O(N).

soomrack ★★★★★
()
Ответ на: комментарий от dikiy

leasqr из octave

прошу прощения, fminsearch конечно же.

dikiy ★★☆☆☆
()
Ответ на: комментарий от soomrack

Я бы даже сказал, что среди множества прямых, на которых достигается максимум пересечения шаров всегда можно выбрать такую, которая является касательной к какому-то шару. Осталось только перебрать все прямые, итого сложность первой задачи O(N).

касательной к шару является не прямая, а коническая поверхность. тут весь цимес в том, чтобы перевести R^3 в R^2

dikiy ★★☆☆☆
()
Ответ на: комментарий от Deleted

по поводу первой задачи можно так:

рассмотрим функцию f(x,y)=z. f - это сумма всех расстояний до прямых. В случае с одной прямой - функция имеет вид перевернутой крыши с ребром лежащий на плоскости z. В случае с 10 прямыми мы имеем дело с политопом. очевидно, что решение будет лежать в одной из вершин(а так же возможно, что на ребре или целой грани политопа). надо их все найти и перебрать. в принципе это и делает симплексный алгоритм. но так как задание для олимпиады (я таки посмотрел гуглодоки :), то надо реализовать упрощенный вариант самому.

можно тупым перебором:

чтобы найти все вершины политопа надо для начала построить все плоскости для каждой из линий. Возьмем например линии y=x и x=0, тогда получим такое http://ompldr.org/vZ2lxYQ

потом найти все их пересечения.

А можно таки реализовать алгоритм симплекса. Он не такой трудный. в данном случае у тебя только две переменные. Каждое ребро политопа задается двумя плоскостями. Надо лишь потихоньку спускаться по ребрам.

политоп для двух линий (из тех, что в первой ссылке) выглядит так: http://ompldr.org/vZ2lxZA

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Вы таки математик...

Пусть проекции двух шаров пересекаются. Ищем «угловые» лучи, т.е. лучи проходящие по касательной к обеим шарам. Их очевидно:

1) два - берем оба

2) один - берем один

3) континум (проекции совпадают) - выкидываем любой из шаров, они с т.з. задачи индентичны

4) ни одного (проекции не перескаются) - не берем ни одного

4) ни одного (одна проекция полностью входи в другую) - упс... берем два, проходящие через центры шаров.

Где тут плоскость и где изоморфизм, я в упор не вижу.

Дальше проходим все лучи и смотрим сколько шаров каждый прокалывает.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Пусть проекции двух шаров пересекаются. Ищем «угловые» лучи, т.е. лучи проходящие по касательной к обеим шарам. Их очевидно:

ну мне было бы проще изоморфизм сделать, чем со сферическими координатами думать. Но можно попробовать:

надо же каким-то образом проекции задавать. Если не переходитьна плоскость, то будут сферические координаты центров + угол раскрытия. если угол между центрами меньше чем сумма угловраскрытий обоих - то есть точка пересечения... Ну да, в обем-то можно и так :)

4) ни одного (одна проекция полностью входи в другую) - упс... берем два, проходящие через центры шаров.

может быть такое, что

1) круг большой и содержит маленький, но центр большого не содержится в маленьком

2) большой полностью содержит некоторое хитросплетение других поменьше.

Где тут плоскость и где изоморфизм, я в упор не вижу.

ну мне так навскидку проще было.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Deleted

Если три шара попарно пересекаются, это не значит, что существует пересечение всех трех шаров.

Для тебя и других, не окончивших 11 класс предлагаю немного забежать вперёд программы и посмотреть Пример 5.2.

auto12884835
()
Ответ на: комментарий от dikiy

Помню, натыкался на пример в OpenGL book, который как раз предназначался для подсчета количества пересечений «лучом зрения» разных объектов.

Eddy_Em ☆☆☆☆☆
()

такс по задаче№1

как уже выше было замечено

представь сферический(охватывающего все данные шары) планетарий где в центре 0,0,0 горит точечный источник света.

процедура указаная ниже для уменьшения перебора круговых теней от каждого шара на планетарную сферу.

упорядочим шары по удалённости ближайшей точки поверхности к 0,0,0 (все шары которые охватывают её автоматически задеваются лучём , все шары которые касаются поверхностью охватывают полпространства(радуис-вектор есть нормаль к плоскости разделения) )

теперь для каждого шара смотрим как он затеняет более удалёные - и находим области максимальной тени - тут похорошему нужно завести структуру которая будет отмечать какие зоны планетарной сферы уже можно не разберать повторно.

хз какая алгоритмическая сложность - зависит от структуры даных

qulinxao ★★☆
()
Ответ на: комментарий от dikiy

ну смотри - берем узел, берем _все_ соседние с ним узлы

почему же искомый подграф дожен образовывать отдельную единицу связности? уточнил про n^3, поскольку даже первая фраза на вики намекает: линк

anonymous
()
Ответ на: комментарий от dikiy

надо же каким-то образом проекции задавать. Если не переходитьна плоскость, то будут сферические координаты центров + угол раскрытия. если угол между центрами меньше чем сумма угловраскрытий обоих - то есть точка пересечения... Ну да, в обем-то можно и так :)

O_O? Месье знает толк в извращениях... что, на банальных декартовых векторах и их скалярных произведениях такого не сделать? Луч из нач. координат задается одной точкой вообще то... ;-)

AIv ★★★★★
()
Ответ на: комментарий от dikiy

1) круг большой и содержит маленький, но центр большого не содержится в маленьком

Наплевать, важно что луч проходящий через центр маленького проходит через оба.

2) большой полностью содержит некоторое хитросплетение других поменьше.

Опять наплевать, лучи относящиеся к поменьше пройдут через большой. Фикус в том, что бы от континиума лучей перейти к конечному набору, заведомо содержащему луч с макс числом пересечений с шарами.

AIv ★★★★★
()
Ответ на: комментарий от qulinxao

Это избыточное решение, поскольку задача о нахождении оьбласти с макс числом пересечений не стоит. СТруктура «планетарной тени» (и особенно ее построение) будет весьма нетривиальной...

AIv ★★★★★
()
Ответ на: комментарий от auto12884835

Если три шара попарно пересекаются, это не значит, что существует пересечение всех трех шаров.

Для тебя и других, не окончивших 11 класс предлагаю немного забежать вперёд программы и посмотреть Пример 5.2.

http://ompldr.org/vZ2l2dA

dikiy ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.