![]() |
Модераторы: Alx, Fixin |
![]() ![]() ![]() |
|
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Более понятная формулировка. Есть столбики одинакового радиуса. Надо найти минимальную длину веревки, которой можно обтянуть все столбики так, чтобы ни один не остался снаружи. Примечание. Предполагается активное использование массивов. Моя голова сломалась ![]() ![]() |
|||
|
||||
aram90 |
|
|||
Bug hunter Профиль Группа: Участник Сообщений: 17 Регистрация: 1.12.2008 Где: Yerevan, Armenia Репутация: 2 Всего: 3 |
Надо превратит круги в точки, и решить задачу для точек - центров окружностей, потом добавить к нему 2*pi*r, и
получится ответ. А задачу для точек надо решить методом построения выпуклой оболочки |
|||
|
||||
maxdiver |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 2 Всего: 18 |
Всё так, только непонятно, как в условии согласуется "N-угольник" и "кривая" - это же разные вещи.
Если действительно разрешена произвольная кривая, то метод aram90 правильный. Хотя я когда-то решал эту задачу, и до идеи с 2 pi r не дошёл, и где-то часа полтора писал эту геометрию со всякими дугами, секторами окружностей... ![]() |
|||
|
||||
KasMP |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
![]() ![]() (или это компенсируется засчет того, что центр окружности (случай с точками) находится "дальше", чем сам окружность? ![]()
Это зеркало! Я просила дописать к началу названия зеркала "[Алгоритм]" - внимательный админ сказал, что это, к сожалению, невозможно. Добавлено через 2 минуты и 17 секунд
|
||||||||
|
|||||||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: нет Всего: 372 |
KasMP, вот точно такая же задача: http://acm.timus.ru/problem.aspx?space=1&num=1020
Я её решил так(за кривость не ругать, тут был важен только результат):
То есть по уравнению прямой находим сначала расстояния для точек, а потом прибавляем 2*Pi*R как уже было сказано. Timus сказал что решено верно)) |
|||
|
||||
KasMP |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
THandle, очень рада твоему участию
![]() ![]() Твой код решает задачку с Timus-а, это бесспорно ![]() ![]() Но моя задачка и задачка с Timus-а - отнюдь не одно и то же ![]() ![]()
![]() Моя основная проблема как раз и состоит в том, что я не знаю (пока), как выбрать правильную последовательность вершин (самая правильная та, которая требует самую короткую веревку). Впрочем, надо изучить метод построения выпуклой оболочки ![]() Задачку с Timus-а я бы решила без проблем сама - сложить длины отрезков несложно ![]() Тем не менее, от задачки с Timus-а есть большая польза ![]() ![]() Добавлено через 1 минуту и 3 секунды
Большое спасибо за наводку ![]() ![]() |
||||
|
|||||
maxdiver |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 2 Всего: 18 |
KasMP, какое-то хитрое условие
![]() Но раз получается, что "окружать" сами столбики мы не должны, т.е. дуг не надо, то получается, что 2 Pi R действительно прибавлять не надо, а сама искомая кривая будет представлять собой многоугольник, причём выпуклую оболочку центров окружностей (в этом легко убедиться, достаточно сдвинуть каждый отрезок к центрам обеих окружностей; т.к. в точке касания радиус перпендикулярен отрезку, то никаких "компенсирований" не будет). Ну а выпуклая оболочка - вообще стандартная вещь. Например, вот: e-maxx.ru/algo/convex_hull_graham ![]() |
|||
|
||||
KasMP |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Видимо, я совсем разучилась объяснять...
![]() ![]() Еще условие можно сформулировать так ![]()
Добавлено через 2 минуты и 24 секунды
Спасибо за ссылочку ![]() Я вчера нашла другую, где описывается не только метод Грэхема, но и метод Джарвиса ![]() ![]() |
||||||
|
|||||||
maxdiver |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 2 Всего: 18 |
Ну раз окружать таки надо, то и прибавлять 2 pi r надо тоже ![]() Откуда это берётся - оттуда, что если мы рассмотрим все столбики (не считая тех, что не в выпуклой оболочке), то в сумме эта кривая "накрутит" дуг как раз на полные 360 градусов, т.е. ровно на одну длину окружности. В этом можно убедиться, если мысленно удалить все прямые отрезки кривой, как бы совместив все столбики в один - как раз все дуги кривой сложатся и образуют одну окружность.
Если ограничения маленькие, то можно и Джарвиса. Хотя мне всегда казалось, что Грэхэм пишется проще, да и асимптотически в общем случае он лучше. |
||||
|
|||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Итак, алгоритм я полностью поняла
![]() ![]() Рано или поздно я все это реализую и покажу вам результат ![]() К слову, maxdiver, у тебя очень хорошая ссылочка ![]() ![]() |
|||
|
||||
KasMP |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Я нелепо споткнулась на самом неожиданном месте, на поиске самой нижней (правой) точки.
У меня 2 функции:
Если не меньше, то проверяем, а не совпадают ли ординаты. Если совпадают, то более чем логично сравнить абсциссы... Лучшая точка та, у которой абсцисса больше. Потом PresentFirstPoint возвращает в своему руководителю LowermostRightPoint номер лучшей на данный момент точки.По-моему, все идеально. Но работает, как хочет... То правильно, то выбирает правейшую (нижнюю) точку, то вообще левую верхнюю ![]() ![]()
Добавлено через 4 минуты и 31 секунду Если кто-то решится помочь, то следующее - для вашего удобства ![]()
Добавлено через 7 минут и 18 секунд Еще быстрая сортировка не сортирует точки в порядке увеличения угла (уменьшения косинуса) массив... Но уж с этим я должна разобраться!!!!!!!!! |
||||||||
|
|||||||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: нет Всего: 372 |
KasMP, ох... C++...
Покажи то описание по которому ты пишешь алгоритм. Я попробую сначала на Паскале сделать, а потом перевести... Задачка интересная. ![]() Еще, чтобы не возникало подобных тем: http://forum.vingrad.ru/forum/topic-230265.html Я сделал зеркало на эту тему во флейм(пока на неделю). Если против этого зеркала имеешь что-то - сразу удалю ![]() |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Вот ![]() Ок, больше не буду ![]() ![]()
Удали, пожалуйста ![]() Добавлено через 8 минут и 44 секунды Вообще говоря, остальные части алгоритма у меня написаны и должны работать (по крайней мере, на мини-тестиках выполнялись правильно). А вот с на первый взгляд легкой задачкой определения самой нижней (правой) точки творится что-то нереальное! Вот где у меня ошибка? Я прогоняла на бумажечке разные значения всего - все правильно. Может быть, ошибка в каких-то конкретно моих настройках? |
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: нет Всего: 372 |
Да я не против ![]() Ок. В общем - делаю сейчас прожку. Для наглядности все точки выводим в виде рисунка на экран(типа как в описании алгоритма). Получилось найти первый элемент и отсортировать массив. Остальное буду пробовать сделать вечером... |
|||
|
||||
KasMP |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: 2 Всего: 30 |
Напишу заголовки моих функций (вдруг ты решишь организовать свои подобным образом
![]() ![]()
Добавлено через 48 секунд
Как показывает опыт, переходят и даже думают (а иногда де отвечают) ![]() Спасибо ![]() |
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Интересные и занимательные задачи по программированию | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |