![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
a.k.a. Skull
Форумчанин
Регистрация: 17.11.2009
Сообщений: 963
|
![]()
День добрый.
Задание: Коллекцию из N матрешек нужно перевезти на далекое расстояние. Для этого их нужно упаковать, чтобы они занимали как можно меньше места и при этом не гремели. Каждая из матрешек характеризуется своим размером, который задается натуральным числом. Среди них могут быть матрешки одинакового размера. Вы можете их вставлять друг в друга по такому правилу: если первая матрешка имеет размер L, то она может быть вставлена в матрешку размера L+1. Вложенность может быть сколь угодно большой. Например, если вы имеете три матрешки размера 10, 11 и 12, то можете сделать из них одну размера 12, положив первую во вторую, а затем вторую (с первой внутри) в третью. А если же у вас в наличии матрешки размера 10, 20 и 21, то из них можно получить только две упакованные матрешки. Ваша задача узнать, какое минимальное количество матрешек можно получить. Входные данные В первой строке входного файла задано целое число N (0 < N ≤ 10^5). В следующей строке через пробел записаны N натуральных чисел, каждое из которых не превышает 10^9— размеры матрешек. Выходные данные В выходной файл необходимо вывести одно целое число — минимальное количество упакованных матрешек. В общем не долго думая решаю: Код:
Код:
В общем нужен другой алгоритм решения, просто на словах, писать программу за меня не надо (я понимаю, что никто и так не стал бы, но все таки :D)
Все тривиальное просто
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
Сортировку можно пофиксить, методов дофига, но проблема не в этом. Основная проблема вот тут:
Код:
А должно быть какое? Правильно, должно быть 3.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 12.11.2010
Сообщений: 8,568
|
![]()
Ну, могу предложить вот что.
В массиве посчитать количество последовательностей, таких, что при их упорядочивании соседние её члены отличаются на 1. Оно и будет равно минимальном количеству матрёшек. |
![]() |
![]() |
![]() |
#4 |
a.k.a. Skull
Форумчанин
Регистрация: 17.11.2009
Сообщений: 963
|
![]()
veniside, спасибо, поправил:
Код:
![]() Вадим Мошев, то, что ты предлагаешь, тоже требует множество пробежек по массиву для составления этих последовательностей, а потом еще и сортировки... Врядли это будет работать быстрее. Либо я что-то не так понял.
Все тривиальное просто
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 12.11.2010
Сообщений: 8,568
|
![]()
Ну, сначала сортировка (рекомендую Быструю или сортировку Шелла), а потом мой алгоритм.
|
![]() |
![]() |
![]() |
#6 |
a.k.a. Skull
Форумчанин
Регистрация: 17.11.2009
Сообщений: 963
|
![]()
Ахр*неть, нет слов. Очень быстрая сортировка, спасибо, Вадим. Странно, что про нее в универе не рассказывали. Осталось понять, как она работает, но тут я как-нибудь сам :D. Сейчас попробую избавиться от рекурсии и посчитать последовательности, как ты советовал.
Все тривиальное просто
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 11.08.2009
Сообщений: 433
|
![]()
Ну, для того чтобы отработало за 1 сек, нельзя использовать алгоритм, сложнее чем n*log(n)^k, это очевидно.
сортировку вы, допустим, сделаете слиянием или быструю (но у этой в худшем случае тоже сложность n^2, так что при наличии нужного теста вы тоже запоретесь), но вот далее рекурсия ваша... мне просто лень углубляться в ваш код, если бы на словах объяснили.. ![]() Вот пару плохих, требующих доработки мыслей насчет задачи: вместо прямого решения в лоб, а-ля сортану и найду, рассмотреть сортировку лишь как способ посчитать количество. как примерно можно было бы решить задачу: создать еще 1 массив, в котором просто проставить значения размеров матрешки, а потом посчитать их количество. далее, обычно, легко придумать, как по такой матрице дать ответ на поставленный в задаче вопрос за линейное время. но вот ограничение на размер 10^9 наводит на мысль о том, что этот способ решения от нас составители старательно спрятали. если хотя бы 10^6... ладно, возвращаемся к исходным данным. допустим, мы отсортили массив за n*log(n) сортировкой слиянием. далее что? далее помним, что нам нужна "линия". идем по массиву и считаем количество значений. на переходах от одного значения к другому проверяем, рядом ли значения. если да, то какое-то количество матрешек с предыдущего уровня можно упрятать в матрешки следующего. если нет, тогда все матрешки предыдущего добавляются к общему количеству матрешек. далее на текущем уровне считаем количество матрешек. если их больше или равно, чем на предыдущем, тогда все с предыдующего упрячем в текущие, текущие заносим в буфер предыдущих. если меньше, тогда количество предыдущих - количество текущих добавляем к общему количеству матрешек. и так далее. надеюсь, суть вам ясна, сложность алгоритма n*log(n) на этапе сортировки и n на этапе подсчета, т.е. O(n*log(n) + n) = O(n*log(n)), что вам как раз подойдет. если что не понятно, я поясню или код напишу, тут на этапе подсчета его кот наплакал. Кстати, пока писал Вадим Мошев вам весьма дельную мысль подкинул, но он забыл указать, что вам придется посчитать минимальное количество упорядоченных последовательностей, соседние члены которых отличаются на 1, а я вам, считайте, написал как это сделать. Последний раз редактировалось mMAg; 16.11.2011 в 15:25. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разработать алгоритм и составить программу для решения задачи. Длину последовательности задать | димон4ик_ | Помощь студентам | 2 | 18.10.2011 09:39 |
> Алгоритм последовательности 2an-2–2, где a1=3 и a2=2 | turtles | Помощь студентам | 6 | 27.09.2011 12:30 |
Сложнейший алгоритм (сортировка последовательности чисел по группам), программа? язык написания? | Владимир777 | Помощь студентам | 1 | 02.03.2010 22:15 |
Сложнейший алгоритм (сортировка последовательности чисел по группам) | Владимир777 | Фриланс | 3 | 02.03.2010 21:50 |