Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помогоите решить олимпиадную задачу

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

ScipionST



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Задача звучит приблизительно так.  
   Жила-была "Звезда смерти" (наверное Deathstar из Star Wars). И решила она пальнуть по планетах, но так, чтобы за один выстрел зацепить как можно больше планет. Собственно говоря и надо расчитать как ей надо пальнуть и сколько планет она зацепит (только максимум). Вообщем надо найти максимальное количество шариков, через которые проходит прямая
   Входные условия: Количество планет, координаты их центров и их радиусы, звезда может стрелять из любой точки.
 
   Помогите пожалуста решить, т.к. я уже долго над мучаюсь, а придумать ничего не могу.
Изначально задача должна была быть решена в 3D. Но в принципе для начало сдалось бы её решить на координатной плоскости (2D).
 
  Зарание спасибо!!!

Всего записей: 420 | Зарегистр. 05-02-2005 | Отправлено: 16:31 23-02-2005
mxm1975



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
зачем там радиусы? предполагается, что планеты движутся?
 
если радиусы действительно лишние -- "стрельба" сводится к нахождению максимального числа точек на одной линии

Всего записей: 279 | Зарегистр. 31-07-2002 | Отправлено: 18:23 23-02-2005
Sensej



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
зачем там радиусы? предполагается, что планеты движутся?  

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

Всего записей: 44 | Зарегистр. 09-05-2004 | Отправлено: 21:04 23-02-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ScipionST
Выскажи мудрую теорию, что луч звезды смерти, встретив на своём пути одну планету и уничтожив её дальше не пройдёт ....  Но это так
А один из алгоритмов такой:
Массив с координатами планет. По очереди (перебирая все) строишь прямую между двумя планетами и считаешь на какой прямой их больше. Всё.

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 21:34 23-02-2005
Kotzillo



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно попробовать решить задачу в лоб - т.е. прострелять во все направления с каким-то шагом, а затем посмотреть сколько максимально планет зацепило. Не изящно конечно, зато очень жизненно

Всего записей: 42 | Зарегистр. 26-10-2004 | Отправлено: 21:45 23-02-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kotzillo
Теперь посчитай на поле (2D) 200*200 в 16 направлениях

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 21:59 23-02-2005
max0z

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
на плоскости - делим зону обстрела на большое число частей (например 720 - по полградуса),
заводим соотв массив.
от каждой планеты проводим две прямые - от одного края и от другого,  соотв. получаем два угла , a1 и a2 , в нашем массиве во всех эдементах от а1 до а2 увеличиваем счётчик.
После перебора всех планет, просто выбираем в массиве элемент с наибльшим счетчиком и в том направлении бахаем.
Для 3d можно решить аналогично - небольшую сферу вокруг нас делим по плоским пятигранникам, каждый из них делим еще на маленькие кусочки. Вычисляем проекции от планет на эти кусочки  - и вперед точно также...только геометрии будет побольше..

Всего записей: 21 | Зарегистр. 15-02-2005 | Отправлено: 22:00 23-02-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
max0z
Зачем всё так сложно?

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 22:09 23-02-2005
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ScorpionST
А можно всё таки прямо текст задачи сюда (оригинал), сдается мне что что-то недоопределено, слишком много степеней свободы для просто олимпиадной задачи. Скорее всего звезда, которая стреляет находится в какой-то точке, которая задана.
 
 
Добавлено:
KADABRA
что значит прямую между планетами? а радиусы?
 
Добавлено:
maxoz
а из какой точки стрелять то? автор утверждает, что звезда может находиться где угодно. Вот если её местонахождение задано, тогда ваша идея близка к верной (хотя работать ваш алгоритм не будет, но направление мышления верное

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 22:11 23-02-2005 | Исправлено: FuzzyLogic, 22:19 23-02-2005
max0z

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KADABRA
на плоскости как-раз просто полчуается..
а чтобы такой-же подход применить для 3d надо разбить сферу на большое кол-во желательно одинаковых плоских фигур и считать проекции от планет на эту сферу, увеличивая счетчики для фигур покрытых проекцией..
из платоновых тел ближе всего к сфере - как раз то что состоит из правильных пятигранников (не помню оно называется)..поэтому и предложил такой подход..
 
 
Добавлено:
FuzzyLogic
интерестно почему алгоритм работать не будет ?
--
если звезда может быть где угодно, то применяем етот алгоритм к любой планете,
получаем вектор..разместим звезду на этом векторе как можно дальше (чтобы все планеты были в одну сторону  и пальнем..

Всего записей: 21 | Зарегистр. 15-02-2005 | Отправлено: 22:32 23-02-2005
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
max0z
Если задано откуда стрелять, тогда решается так (для 2D):
 
Пусть есть N планет
 
1.  Для каждой планеты, находим две касательных, проходящих через звезду (см. любую книжку по аналитической геометрии как это сделать)
 
2. Каждая и этих касательных однозначно определяется углом (угол допустим, относительно оси x). Таким образом, для каждой планеты мы нашли интервал [угол1,угол2] в который надо стрелять чтобы попасть в планету.
 
3.  Располагаем все эти интервалы на отрезке [0,360градусов] и ищем интервал который пересекает максимальное кол-во интервалов [угол1,угол2]. Делается это элементарно - сортируем все углы по возрастанию, а потом просто пробегаем по ним, ведя счетчик: если угол является углом1 (то есть начало интервала для одной из планет), то счетчик увеличивается, иначе - уменьшается. Таким образом мы выделим интервал на котором значение счетчика максимально (счетчик - колво сбитых планет), в любом направлении из этого интервала можно стрелять.
Кстати, тут надо учесть что интервал у нас "зацикленный", т.е. может получиться так что некоторые интервалы откроются, но не закроются. Но это уже тонкости реализации.
 
 
Добавлено:

Цитата:
 интерестно почему алгоритм работать не будет ?  

А как вы собрались определять шаг (почему полградуса?) одна планета может иметь радиус 1000000 единиц, а другая 0.000001, тоже самое и с расстояниями ... и чего делать?
 
Добавлено:
max0z я вам даже картинку нарисовал
   
Представьте что эти прямые выходят из одной точки (звезды смерти), которая находится далеко (внизу-слева) и угол между этими прямыми 0.00000001 градуса
 
Добавлено:
KADABRA

Цитата:
 Зачем всё так сложно?

Ну подскажите как сделать просто

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 22:36 23-02-2005 | Исправлено: FuzzyLogic, 23:03 23-02-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FuzzyLogic
Да. Некая сложность есть. Но есть и несколько альтернативных методов решения. И всё-таки некоторая погрешность может быть допушена.

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 23:52 23-02-2005
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KADABRA
Задача олимпиадная, поэтому никаких погрешностей быть не должно они именно на эти моменты и будут смотреть. Тесты к олимпиадным задачам всегда строятся так чтобы покрыть (по возможности) все крайние случаи и выявить недостатки некорректных алгоритмов и реализаций.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 02:18 24-02-2005 | Исправлено: FuzzyLogic, 05:45 24-02-2005
vhl



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
как насчет такого решения:
через каждые 2 планеты проводим по 2 касательной, эти касательные пересекают контур по 2м отрезкам. Находим тот промежуток контура, на котором пересеклось наибольшее число отрезков. Искомая точка лежит в этом промежутке. Остается перебрать прямые исходящие из краев промежутка и выбрать ту, что пересекает максимальное число планет.

Всего записей: 106 | Зарегистр. 28-12-2003 | Отправлено: 12:05 24-02-2005 | Исправлено: vhl, 12:16 24-02-2005
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А какой контур? Описаный вокруг всех планет? Дело в том что касательные могут пересечься до того как пересекут контур. Я тоже думал где-то в том направлении, но потом порисовал, и мне показалось что не получается ... хотя может я и не прав.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 12:13 24-02-2005
vhl



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
FuzzyLogic
значит задача стоит в поиске этих отрезков, а может областей! Дальше уже твоя логика поиска

Всего записей: 106 | Зарегистр. 28-12-2003 | Отправлено: 12:23 24-02-2005 | Исправлено: vhl, 12:27 24-02-2005
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у меня весь затык с нахождением пересечений...
на плоскости имеем множество кусочков окружности (или плоских углов, кому как удобнее), в 3D - множество кругов (или телесных углов), надо найти лишь самое тяжелое множество их пересечений (по количеству входящих кругов)... в принципе все...  
есть еще такая мысль: все планеты можно поместить радиусами на одну большую сферу, пропорционально меняя у них радиусы... правда, не знаю, как это может пригодится
 
Добавлено:
в принципе, и алгоритм перебора пересечений уже есть... тока нагрузка по времени неслабая, обычно в олимпиадах есть ограничение по времени... т.е. на 1000 планет уже нехилый процесс получается... плюс нагрузка на пямять из-за рекурсивных вызовов... можно, конечно, рекурсию обойти... но время останется то же... это если делать непрерывное пересечение..
если дискретное, то за расстояние можно взять минимальный радиус...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 15:25 24-02-2005
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sleepwalker
Ну я почему и сказал ... как-то не очень похоже на олимпиадную задачу, ни по ресурсоемкости, ни по затратности с точки зрения программирования (обычно любая олимпиадная задача должна писаться за 30 минут, а тут что-то как-то не очень похоже, особенно в 3D случае  Т.е. либо что-то не так в условиях, либо всё таки есть хитрое решение.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 15:56 24-02-2005 | Исправлено: FuzzyLogic, 15:57 24-02-2005
Sleepwalker



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

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 17:16 24-02-2005
Function

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Координаты точек внешних сторон шаров даны. A(a,b)
Координаты точек прямых даны. B(c,d)
 sqrt( (a-c)^2+(b-d)^2 )<=сигма  (Теорема пифагора)
 
 

Всего записей: 112 | Зарегистр. 31-01-2005 | Отправлено: 18:36 24-02-2005 | Исправлено: Function, 19:11 24-02-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помогоите решить олимпиадную задачу


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru