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)

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

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

upd: http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html

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

первое — элементарно

На курсовик тянет, вообще-то. Особенно если попытаться это аналитически сделать ☺

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

Анекдот в тему ☺

Пpоводят исследования на матфаке. Студентам pазных куpсов задают один вопpос «Сколько будет 2 умножить на 2?»

Студенты 1 куpса сходу отвечают:

- Четыpе!

Студенты 2 куpса сначала pоются в шпаpгалках, потом отвечают:

- Четыpе!

Студенты 3 куpса достают калькулятоp и посчитав тоже дают пpавильный ответ.

Студенты 4 куpса пpосят вpемя, чтобы сходить в компьютеpный класс и составить для pасчета пpогpамму.

Спpашивают студента 5 куpса. Он возмущенно:

- Я что все константы наизусть помнить должен?!!!

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

Слишком ты оптимистично относишься к первокурсникам.

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

Eddy_Em ☆☆☆☆☆
()

Рома, а почему из трех ссылок на гуглодоки только в одной — задачка, да и та — одна? Второй нет.

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

Расстояние. Причем системы — на неравенства. Жопа-с.

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

Как нет? Третья ссылка - первая задача, две первые - вторая (в каком порядке гугл-драйв предложил, в таком и запостил).

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

Вона что! Я невнимательно глазами пробежался. Прямые-то — на плоскости! Да еще и грубо говоря, образуют прямоугольную сетку!

Eddy_Em ☆☆☆☆☆
()

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

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

Вона что! Я невнимательно глазами пробежался. Прямые-то — на плоскости! Да еще и грубо говоря, образуют прямоугольную сетк

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

dikiy ★★☆☆☆
()

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

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

dikiy ★★☆☆☆
()
Ответ на: O tempora, o mores! от beastie

Первый курс LinAlg. А поскольку скоро декабырь, то и подавно.

а ну-ка, просвети, как можно исключительно методами LinAlg решить.

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

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

реши первое хотя бы для треугольника :)

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

Слишком сложно. См. мой первый пост.

смотри мой предпоследний пост :)

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

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

beastie ★★★★★
()

как вариант для первой задачи (лучше мною предложенного сначала):

очевидно, что решение существует, так же существует решение не хуже оптимального, которое при этом _касается_ одного из шаров. Следовательно берем краевые точки всех шаров относительно луча. Поулчаем 2N лучей. Ну и проверяем каждый. Сложность получается O(N^2)

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

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

да. первая оказалась не сложной (но я в ответе к тебе, там где я про треугольники говорил имел в виду вторую).

dikiy ★★☆☆☆
()

1 можно решить и путём прямого построения, заливки, и перебора точек по прямой.

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

которое при этом _касается_ одного из шаров.

либо точки пересечения любых двух шаров

//fixed

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

памяти для плоскости хватит, делаешь массив плоскости заливая 0 (нулём), потом заливаешь кружочки допустим 1 (единицей), а потом топаешь по точкам прямой, и сравниваешь, если проходишь парог 0->1 = инкрементируешь.

Правда такое решение может быть сильно неточным.

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

100 метров всего лиш

координаты задаются не в целых числах, а в действительных.

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

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

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

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

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

во-первых - данный тобой алгоритм найдет не оптимальное решение. А во-вторых Две задачки (комментарий).

ну и есть метод намного проще: Две задачки (комментарий)

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

Поулчаем 2N лучей. Ну и проверяем каждый. Сложность получается O(N^2)

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

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

што такое слева и справа от шара? он же круглый

иттить. а я и не заметил, что мы в R^3.

dikiy ★★☆☆☆
()

еще вариант:

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

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

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

dikiy ★★☆☆☆
()

1 - тривиальна до неприличия. Для каждого шара строим охватывающий его конус с вершиной в (0, 0, 0). То есть по числу шаров получаем 4 параметра, 3 направляющие и четвёртый - угол при вершине. Далее на Common Lisp пишем функцию, которая на основании двух наборов этих четырёх параметров определяла бы, перекрываются эти два конуса или нет. Формулу выводим, основываясь на знаниях элементарной геометрии или ищем в bing.com. Далее для каждого конуса считаем число перекрывающихся с ним. Маскимальное полученное значение именуем profit и выводим на экран.

2. Полагаю решится построением уравнения <суммарное расстояние до прямых>=f(...), численным его дифферинцированием и обходом вектора по нулевому значению. Может быть есть решение очевиднее, лень возиться.

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

Далее для каждого конуса считаем число перекрывающихся с ним. Маскимальное полученное значение именуем profit и выводим на экран.

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

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

dikiy ★★☆☆☆
()

1. Я так понимаю, это в трехмерном пространстве. Раскрасить небесную сферу для наблюдателя, смотрящего из точки (0,0,0) цветами, зависящими от количества шаров, закрывающих данную точку сферы. Все, задача решена. Ну да, проекцию какую-то раскрашивать придется.

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

Верное замечание. Тогда для каждого конуса придётся строить дерево, в котором каждый дочерний узел является конусом, пересекающимся со всеми родительскими узлами и искать максимальную глубину среди всех деревьев. Где-то так. Ведь конус фигура таки невогнутая, и если несколько пересекаются каждый попарно между собой, то существует фигура AuB & BuC & CuA значит имеют одну и только одну общую область пересечения. На практике, строим матрицу попарного пересечения и от неё работам, строим деревья.

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

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

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

Если работать не с конусами, а их сечениями считать придется намного меньше.

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

Ну, аналитически, конечно, скорее всего, не решить, а вот численным методом не сложно, наверное.

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

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

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

На курсовик тянет, вообще-то. Особенно если попытаться это аналитически сделать

Это элементарная задачка для первого курса. Ищется длина перпендикуляра из центра шара на луч, если она меньше радиуса шара, то значит шар пересекается.

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

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

dn2010 ★★★★★
()

А во второй прямые или отрезки?

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

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

Вот я и говорю: численное решение — элементарно. Аналитика — жопа.

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

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

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