Страница: 1 |
проблема в том, что таких точек бесконечное множество (если я правильно понял условие). Следовательно найдя определённую точку довольно сложно быть стопудово уверенным, что это та самая точка и более правильного решения быть не может. Значит надо искать то самое множество, а потом уже наобум брать оттуда какую-нибудь точку. Следовательно тут надо мутить со множествами, их пересечениями и объединениями. Это программа первого курса, а я на четвёртом - у меня проблемы, ни хрена уже не помню... Но преполагаю, что надо так: сначала смотрим на ось Ох (или Оу). Потом проецируем все прямоугольники на неё и пробиваем самую "чёрную" область, то есть область в которой пересекается наибольшее количество прям-ков. Потом делаем то же с другой осью и ищем пересечение этих "чёрных" областей. Полученный прям-к будет скоплением искомых точек. Выбирай середину - не ошибёшся . Самое сложное здесь: определить самую "чёрную" область, но и это не представляет особых проблем. Алгоритм типа: 1) находим самую правую левую сторону прям-ка. 2) находим самую левую правую сторону прям-ка. 3) если (1) левее (2), то всё в порядке, иначе (1)=(первая влево от (1)). goto (3). 4) наше "чёрное" место находится между (1) и (2). Конечно, требует шлифовки, но незаинтересованному в результате, мне не особо хочется тратить столько сил на его реализацию. В общих чертах решил и всё! Вот если бы какой конкурс замутили, тогда... Если я правильно понял, задача элементарная. Создаем массив NxN, где границы между ячейками - сортированные координаты вершин прямоугольников. Затем по очереди "зарисовываем" прямоугольники, увеличивая ячейки на 1. А потом просто ищем максимум, получаем из координат ячейки координаты соответствующего "элементарного прямоугольника", берем, например, его центр и выдаем... Совсем несложная задача... To Sharp: не совсем понял эту фразу: границы между ячейками - сортированные координаты вершин прямоугольников но если я правильно понял, то возражение - у нас ведь координатная плоскость. Соот-но один прямоуг-к может иметь порядок координат 10^234123412341234 (!!!), а другой 10^(-235623542345234). Это я, конечно, утрирую (хотелось бы посмотреть на переменные такого порядка), но массивы, ИМХО, здесь не полезут - надо чисто сравнением: что больше, а что меньше... В олимпиадах всегда ставится ограничение на тип данных 10^(817262346) степени тебе никто не даст, если сам не попросишь. К тому же написано, что координаты - вещественные числа, что обозначает, что следует использовать тип double. Что же касается мутной фразы "отсортированный массив координат точек вершин", понять ее несложно. Имеем два прямоугольника (-1.0,-1.0 - 1.0,1.0) и (0,0 - 2,2). Сортируем массив координат вершин по X-ам и Y-ам, получаем два массива: X-ов: {-1.0,0.0,1.0,2.0} и Y-ов: {-1.0,0.0,1.0,2.0}. Затем объявляем массив 3*3 (понятно, что он не может быть больше 2*N x 2*N), после чего просто заполняем его ячейки, инкрементируя их содержимое так, как расположены прямоугольники. Т.е.: после 1-го прям-ка: 0 0 0 1 1 0 1 1 0 после 2-го: 0 1 1 1 2 1 1 1 0 Ищем максимум: 2 - находится (тут-то и понадобятся сохраненные раньше отсортированные X и Y) между 0 и 1 по Ox и между 0 и 1 по Oy. Возьмем центральную точку этого прямоугольника - 0.5,0.5 - она будет искомой точкой. Sharp, ты будешь смеяться, но в принципе я имел ввиду то же самое. Твоя двойка - моя "чёрная" зона... Страница: 1 |
Вопрос: Олимпиада х.з. Задача 4
Добавлено: 29.12.03 06:35
Автор вопроса: Павел | Web-сайт:
Задача 4 с какой-то олимпиады. 35 баллов из 200.
На плоскости заданы N прямоугольников со сторонами, параллельными
осям координат (N <= 20). Требуется указать одну из точек,
принандлежащую наибольшему возможному количеству этих прямоугольников.
Входные данные: В первой строке входного файла Input.txt указано
число N. В последующих N строках содержится по 4 вещественных числа
x1, y1, x2, y2 (x1, y1 - координаты левого нижнего, x2, y2 - правого
верхнего угла прямоугольника), числа в строках отделены пробелами.
Выходные данные: В выходном файле Output.txt должна находиться пара
вещественных чисел x, y - координаты искомой точки.
Пример Input.txt:
5
2 2 4 4
-5 1.5 3 4
-1.E20 -1.E20 1.E20 1.E20
1.1E-10 1.1E-10 1.2E-10 1.2E-10
0 0 9 9
Пример Output.txt:
2.5 3.5
Эту задачу я ещё не решил.
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #1
Добавлено: 03.01.04 01:40
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 03.01.04 06:32
Номер ответа: 3
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #3
Добавлено: 08.01.04 23:47
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 08.01.04 23:59
Номер ответа: 5
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #5
Добавлено: 13.01.04 22:40
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 14.01.04 01:31
Да, разве что ты не в тему упомянул про пересечение множеств...
Номер ответа: 7
Автор ответа:
K-00
ICQ: 179750444
Вопросов: 7
Ответов: 20
Профиль | | #7
Добавлено: 04.02.05 13:56
Sharp
а что делать, если координаты прямоугольников - не целые цисла. Индексы массива будут также не целые.
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 04.02.05 19:57
Координаты прямоугольников хранятся в массиве, а не являются его индексами
Номер ответа: 9
Автор ответа:
K-00
ICQ: 179750444
Вопросов: 7
Ответов: 20
Профиль | | #9
Добавлено: 07.02.05 14:32
Не понимаю, что тогда индексы?
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 07.02.05 20:03
Индексы - это номера координат в отсортированном упорядоченном их множестве. Т.е., если у тебя есть координаты 1.5, 2.5 и 4.5, тогда индекс 2.5 - 2