Страница: 1 |
Вопрос: Олимпиада х.з. Задача 4 | Добавлено: 29.12.03 06:35 |
Автор вопроса: ![]() |
Задача 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 03.01.04 01:40 |
проблема в том, что таких точек бесконечное множество (если я правильно понял условие). Следовательно найдя определённую точку довольно сложно быть стопудово уверенным, что это та самая точка и более правильного решения быть не может. Значит надо искать то самое множество, а потом уже наобум брать оттуда какую-нибудь точку. Следовательно тут надо мутить со множествами, их пересечениями и объединениями. Это программа первого курса, а я на четвёртом - у меня проблемы, ни хрена уже не помню... Но преполагаю, что надо так: сначала смотрим на ось Ох (или Оу). Потом проецируем все прямоугольники на неё и пробиваем самую "чёрную" область, то есть область в которой пересекается наибольшее количество прям-ков. Потом делаем то же с другой осью и ищем пересечение этих "чёрных" областей. Полученный прям-к будет скоплением искомых точек. Выбирай середину - не ошибёшся Самое сложное здесь: определить самую "чёрную" область, но и это не представляет особых проблем. Алгоритм типа: 1) находим самую правую левую сторону прям-ка. 2) находим самую левую правую сторону прям-ка. 3) если (1) левее (2), то всё в порядке, иначе (1)=(первая влево от (1)). goto (3). 4) наше "чёрное" место находится между (1) и (2). Конечно, требует шлифовки, но незаинтересованному в результате, мне не особо хочется тратить столько сил на его реализацию. В общих чертах решил и всё! Вот если бы какой конкурс замутили, тогда... |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 03.01.04 06:32 |
Если я правильно понял, задача элементарная. Создаем массив NxN, где границы между ячейками - сортированные координаты вершин прямоугольников. Затем по очереди "зарисовываем" прямоугольники, увеличивая ячейки на 1. А потом просто ищем максимум, получаем из координат ячейки координаты соответствующего "элементарного прямоугольника", берем, например, его центр и выдаем... Совсем несложная задача... |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 08.01.04 23:47 |
To Sharp: не совсем понял эту фразу: границы между ячейками - сортированные координаты вершин прямоугольников но если я правильно понял, то возражение - у нас ведь координатная плоскость. Соот-но один прямоуг-к может иметь порядок координат 10^234123412341234 (!!!), а другой 10^(-235623542345234). Это я, конечно, утрирую (хотелось бы посмотреть на переменные такого порядка), но массивы, ИМХО, здесь не полезут - надо чисто сравнением: что больше, а что меньше... |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 08.01.04 23:59 |
В олимпиадах всегда ставится ограничение на тип данных Что же касается мутной фразы "отсортированный массив координат точек вершин", понять ее несложно. Имеем два прямоугольника (-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 - она будет искомой точкой. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 13.01.04 22:40 |
Sharp, ты будешь смеяться, но в принципе я имел ввиду то же самое. Твоя двойка - моя "чёрная" зона... |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 14.01.04 01:31 |
Да, разве что ты не в тему упомянул про пересечение множеств... |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ICQ: 179750444 Вопросов: 7 Ответов: 20 |
Профиль | Цитата | #7 | Добавлено: 04.02.05 13:56 |
Sharp
а что делать, если координаты прямоугольников - не целые цисла. Индексы массива будут также не целые. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 04.02.05 19:57 |
Координаты прямоугольников хранятся в массиве, а не являются его индексами |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ICQ: 179750444 Вопросов: 7 Ответов: 20 |
Профиль | Цитата | #9 | Добавлено: 07.02.05 14:32 |
Не понимаю, что тогда индексы? |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 07.02.05 20:03 |
Индексы - это номера координат в отсортированном упорядоченном их множестве. Т.е., если у тебя есть координаты 1.5, 2.5 и 4.5, тогда индекс 2.5 - 2 |
Страница: 1 |
|