![]() |
|
Модераторы: Alx, Fixin |
![]()
|
|
| Fedor |
|
|||
![]() Днепрянин ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2090 Регистрация: 8.2.2003 Где: Великий Репутация: 1 Всего: 32 |
И еще одна задача:
Из последовательности, состоящей из N чисел вычеркнуть минимальное количество элементов так, чтоб оставшиеся образовали строго возрастающую последовательность. Это сообщение отредактировал(а) ALEXANDRO - 9.11.2004, 18:46 -------------------- Мы - Днепряне. Мы всех сильней. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
первый вариант - рекурсия:
сводим задачу к двум задачам: 1. когда из массива вычеркнули первый элемент (длина массива уменьшилась на один) 2. когда из массива не вычеркивали первый элемент (в этом случае нужно вычеркнуть после него все меньшие элементы, если они будут) если оптимизировать дальше: 1. организовываем очередь из элементов, содержащих массив и критерий 2. берем на обработку элемент сверху (и удаляем его из очереди) 3. делаем из него два элемента (по вышеописанным правилам) 4. добавляем их в конец очереди 5. повторяем так, пока в очереди не останутся только элементы с пустыми массивами пока по сравнению с первым способом количество операций не изменилось, но теперь можно заметить, что элементы с одинаковыми массивами совсем необязательно обрабатывать отдельно - достаточно обработать тот, у которого критерий меньше - только он нас интересует так что при добавлении к очереди смотрим, не встречается ли там уже такой массив, если да, то выбираем лучший вариант, а другой удаляем... -------------------- qqq |
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: нет Всего: 16 |
Perchilla
Так цикл и есть один. -------------------- |
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: нет Всего: 16 |
sergej.z
Посмотрю, есть ли в моём втором массиве оно или нет. -------------------- |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
а зачем без цикла? я вообще предлагал решение другой задачи, которая появилась недавно в связи с этим предложение: для каждой задачи создавать отдельную тему -------------------- qqq |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Придумал решение задачи Morpheus'а, вечером или завтра код будет. Описание алгоритма на полторы страницы
Хорошая задача, сегодня убил более часа под гневным взором начальника Разбил ряд на два подряда, левый и магазин. В магазине уже просмотренная часть ряда. магазин все время старается передвинутся влево, иначе расширяется. При сдвиге смотрим какой ряд меньше, магазиный или левый, удаляем меньший. Удалённый подряд запоминаем в начале оставшегося(в смысле как аттрибут). При удалении подряда востанавливаем все уделённые им подряды. Тогда: из ряда всегда удаляется наименьший подряд; все удалённые подряды после удаления их "предка", востанавливаются, получая шанс остатся. В коде будет понятно -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| S.A.P. |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: нет Всего: 71 |
Sardar Обычно в задачах по информатике решение простое.
|
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
А для тех кто си не знает можно алгоритм привести?
|
|||
|
||||
| Alx |
|
|||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
sergej.z
на PHP, думаю, лучше |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
php, perl
|
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Задержался с кодом, не было времени написать. Вот мой вариант, описание ниже:
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| nostromo |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: нет Всего: 10 |
Сначала построим для нашей исходной последовательности ориентированный граф.
Обозначим через V(i) число, стоящее на i-м месте в исходном списке (нумерация начинается с 1). Пусть вершинам соответствуют позиции чисел в списке (вершина x_i соответствует числу, стоящему в i-й позиции), а дуга проведена от вершины x_i к вершине x_j тогда и только тогда, когда число i<j и V(i) <= V(j). Очевидно, в силу ассоциативности операции сравнения, данный граф бесконтурный и отсортированная по возрастанию последовательность чисел максимальной длины соответствует максимально длинному пути в этом графе. Задача поиска пути максимальной длины в бесконтурном графе решается с помощью разбиения вершин графа на слои, которое строится следующим образом: 1. Выбираем в графе все источники (вершины, у которых нет входящих дуг) и называем это множество вершин первым слоем. 2. Удаляем из графа вершины предыдущих слоев, у получившегося графа ищем источники и называем их очередным слоем. 3. Повторяем пункт 2 пока вершин не останется. Замечание 1. В бесконтурном графе всегда есть источники. Замечание 2. При удалении из бесконтурного графа нескольких вершин со всеми инцидентными дугами получившийся граф также является бесконтурным. Замечание 3. Обозначим слои через S_1, S_2, ..., S_k. Тогда выполнены свойства a) Между вершинами одного слоя нет дуг. б) Для каждой вершины очередного слоя A найдется по крайней мере одна вершина из предыдущего слоя B, такая, что в графе есть дуга из B в A. Обычно, разбиения вершин бесконтурного графа на последовательность множеств, обладающую этими свойствами и принимают за определение разбиения графа на слои, а то, что приведено выше есть алгоритм поиска этого разбиения. Ясно, что все вершины пути максимальной длины должны попасть в разные слои, поэтому слоев не меньше, чем длина максимального пути. С другой стороны, можно построить путь, длина которого равна числу слоев. Действительно, рассмотрим произвольную вершину A _последнего_ слоя. В предпоследнем слое найдется вершина B, такая что в графе есть дуга из B в A. Поднимаясь последовательно таким образом к первому слою построим искомый максимальный путь. Замечание 4. Алгоритм разбиение графа на слои имеет квадратичную сложность, а поиск пути максимальной длины -- линейную, поэтому весь алгоритм имеет квадратичную сложность. Наивные переборные алгоритмы исходной задачи имеют экспоненциальную сложность (с основанием около 1.5), поэтому значения N выше 200 для них практически недостижимы. Описанный алгоритм я реализовал на языке Smalltalk (VisualWorks). Сначала добавим в стандартный класс SequenceableCollection вспомогательный метод:
Затем создадим новый подкласс GraphSort класса Object с двумя instance-методами:
Все, теперь идем в Workspace и тестируем: list := #(10 30 20 90 70 60 70 80 330 230 560 120 990 340 ) sorter := GraphSort new. r := sorter run: list. В переменной r получили индексы элементов максимальной подпоследовательности: List (1 2 5 7 8 9 11 13) Выведем для наглядности сами элементы: r collect: [:i | list at: i] Результат: List (10 30 70 70 80 330 560 990) Теперь тестируем производительность на списках случайных чисел (64 bit Double): list := (1 to: 100) collect: [:i | Random new next]. Core.Time millisecondsToRun: [r := sorter run: list. ] Результат: 93 list := (1 to: 200) collect: [:i | Random new next]. Core.Time millisecondsToRun: [r := sorter run: list. ] Результат: 1010 list := (1 to: 400) collect: [:i | Random new next]. Core.Time millisecondsToRun: [r := sorter run: list. ] Результат: 8732 --------------------
На пыльных тропинках далеких планет останутся наши следы. |
||||||
|
|||||||
| nostromo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: нет Всего: 10 |
Только что заметил, что в исходной постановке задачи требовалось найти _строго_
возрастающую последовательность, а предложенная реализация ищет неубывающую последовательность. Чтобы привести программу к исходной постановке, нужно в методах "selectSources:" и "run:" заменить нестрогое сравнение "<=" строгим "<". --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
| monster89 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 24.5.2007 Репутация: нет Всего: нет |
кто-то может написать решение этой задачи на Java,а то 2 дня уже не могу с ней разобраться,пожалуйста.
Это то что есть,но из последовательности он берет элементы на шару,а не возрастающую последовательность Это сообщение отредактировал(а) monster89 - 24.5.2007, 07:51 |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Интересные и занимательные задачи по программированию | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |