![]() |
|
|
![]()
|
|
| gluck |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 26.8.2004 Репутация: нет Всего: нет |
Было n палочек одинакового размера. Эти палочки сломали на разные части. Требуется собрать эти палочки.
Например: Входные даные: 1 5 2 5 2 1 2 1 5 Выходные даные: 1 5 1 5 2 2 2 1 5 P.S. Поделитесь идеями, пожалуйста! Буду очень благодарен! |
|||
|
||||
| boevik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1452 Регистрация: 31.5.2004 Где: Израиль Репутация: нет Всего: 35 |
А начальный размер указан?
Из твое примера можно получить и такой вариант: 1 5 1 5 2 2 2 1 5 -------------------- Никогда не говори никогда |
|||
|
||||
| gluck |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 26.8.2004 Репутация: нет Всего: нет |
boevik, я забыл дописать в условии, что исходные палочки минимальной длины.
|
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
n как я понял известно... Тогда так:
x[0..r] - массив длин сломанных палочек i счетчик, i = 0 j счетчик, j = 0 d переменная, d = 0 1. Считаем сумму всех длин x[0] + x[1] + ... + x[r] и получаем Sum(x[]) 2. Соответсвенно длина изначальных палочек равна l = Sum(x[])/n 3. Делаем массив y[0..n] каждый элемент массива y является массивом и добавляя в массив y[] один элемент (новый элемент), например к y[0], мы получаем y[0] = первый элемент, второй элемент, ... , новый элемент. 4. Удаляя например первый элемент из массива y[0] = первый элемент, второй элемент, ... , последний элемент мы получим y[0] = первый элемент, второй элемент, ... , последний элемент, при этом первый элемент = бывший второй элемент и т.д. То есть удаляя элемент мы сдвигаем все остальные влево. Ну а дальше придумываем что-нибудь такое:
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Давай отстроимся от палочек. Тогда задачу сформулировать можно так:
Имеющийся массив чисел разделить на группы так, чтобы сумма чисел каждой группы была одна и та же, а количество групп максимально... верно? Тогда: Начинаем с подсчета общей суммы и разложения ее на множители. Сумма в каждой группе (и кол-во групп) есть произведение части из сомножителей (очевидно), а также сумма числе в группе не менее максимального числа (тоже очевидно). А далее - перебор возможных сочетаний сомножителей (подбор суммы в группе) в сторону увеличения до тех пор пока не будет найдено деление на группы. Само деление выполняется стандартно - числа сортируются, набор группы ведется в направлении уменьшения (т.е. прибавляем очередное число списка, сумма не превышена - фиксируем и едем дальше, превышена - отбрасываем и опускаемся ниже, в общем типично рекурсивная задача). Это сообщение отредактировал(а) Akina - 29.11.2004, 09:40 -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Модератор: Название темы должно отражать ее суть!
gluck http://forum.vingrad.ru/index.php?showtopic=34389 |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Akina, а у меня никакой рекурсии нет
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
cardinal
Ты делал исходя из предположения, что количество палочек тебе известно - сие раз - и не предохранялся от возможного промежуточного переполнения (вернее, оно не нужно из второго твоего предположения что каждая палочка была разломлена строго на 2 части). Если это неверно - в общем случае, а не частном - то без (псевдо)рекурсии не обойтись. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Akina, понял... Идея с разложением на множители неплохая
(обсуждаем на верхнем примере) 1. Посчитали сумму 24. 2. Разложили на множители: 1*2*2*2*3 (с единичкой понятней) 3. Собрали и посчитали всевозможные произведения (все разные): 1*2, 1*3, 2*2, 2*3, 2*2*2, 2*2*3, 2*2*2*3. 4. Минимальное дает нам длину палочек, если мы их можем слепить! 5. Начинаем лепить: ....... берем число 2, значит нам надо собрать 12 палочек, собираем, обламываемся ....... берем число 3, значит нам надо собрать 8 палочек, собираем, обламываемся ....... берем число 4, значит нам надо собрать 6 палочек, собираем, обламываемся ....... берем число 6, значит нам надо собрать 4 палочки, собираем, получается Классно! А главное без рекурсии -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| gluck |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 26.8.2004 Репутация: нет Всего: нет |
Cardinal, что-то я твою идею не совсем уловил!
Если тебе не сложно, можно поподробнее? |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Помоему подробней некуда уже Возьми любые "входные данные" и пройдись с ними по пунктам 1-5 описанным выше. Как будет конкретный вопрос по конкретному пункту, то тогда и задавай, а так что я сто раз одно и тоже писать буду? Самой большой проблемой думаю будет пункт 3. Я пока не придумал как собрать все варианты (то есть алгоритм хороший не придумал)... Может у кого есть какие мысли? -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| gluck |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 26.8.2004 Репутация: нет Всего: нет |
cardinal, допустим нашел ты длину палочек, а как ты собираешься собирать их без рекурсии? По-моему, тут вся фишка в сборке палочек, а не определении длины.
|
|||
|
||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Объясняю как мы обламываемся Вот наши данные (их надо где-нибудь запомнить, т.к. массив мы будем изменять см. ниже) 1 5 2 5 2 1 2 1 5 Мы пускаем цикл от i=0;i<12;i++ (так как двенадцать палочек надо собрать) и лепим... Первый проход 1 + 1 (пробегали слево направо и искали слогаемые, когда нашли обнулили их) От массива осталось 0 5 2 5 2 0 2 1 5 Наткнувшись на 5 мы уже обламались, т.к. длина палочек должна равнятся 2... Ну и так далее... Как дошли до 6 (то есть собрать надо 4 палочки) мы опять вваливаемся в цикл цикл i=0;i<4;i++ Первый проход 1 + 5 от массива осталось 0 0 2 5 2 1 2 1 5 Второй проход 2 + 2 + 2 от массива осталось 0 0 0 5 0 1 0 1 5 и т.д. Ну то есть собрали 4 палки длиной по 6. -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| Akina |
|
||||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
То что я предлагаю - именно в этом и заключается.
не будет рекурсии - будет псевдорекурсия кучей while-ов и аналогичных структур. прямой алгоритм тут не построить.
да запросто. перебрать возможные сочетания множителей - задача дилетантская, тебе просто думать лень. Перемножить - тем более. Единственная тонкость - после получения полного списка составных множителей этот список надо отсортирить по возрастанию, и потом уже пробовать собирать палочки. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||||
|
|||||||
| podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
gluck
Поинтересуйся такой вещью, как китайская теорема об остатках. Наведет на мысли |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |