![]() |
|
![]() ![]() ![]() |
|
FireSnake |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 15.9.2006 Где: Украина, Донецк Репутация: нет Всего: 1 |
Кто знает как решаются задачи типа "считалки"? Т.е. есть от 1 до N людей (по кругу) где каждый K-ый из оставшихся выбывает из строя и необходимо найти последнего оставшегося или вывести список выбывания(в зависимоти от условия).
|
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Я бы делал это в лоб:
1) В Java загоняем N персонажей в Vector, в языках не имеющих такой фичи придется использовать массив, но тогда процедура удаления элемента будет несколько длиннее. Длина массива на данный момент D = N 2) Присваиваем M = K 3) if(M <= D) goto 6 4) M = M - D 5) goto 3 6) Выводим информацию об удалении персонажа стоящено, на данный момент, под номером M и удаляем его из массива. Если это не Vector пишем процедуру смещения всех стоящих после него на шаг влево и уменьшаем размер массива на единицу. Если Vector, все это делается в один шаг. Так или иначе получается D = D - 1 7) if(D = 1) goto 10 8) D = D + K - 1 (отнимать единицу здесь нужно т.к. члены массива сдвинулись и номер выбывшего уже занят кем-то еще) 9) goto 3 10) Выводим информацию о последнем оставшемся 11) Идем пить пиво Кажется нигде не ошибся ![]() -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
esperant0 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 714 Регистрация: 20.5.2005 Репутация: 4 Всего: 14 |
В лоб задачу не рашают.
Решение задачи аналитически есть у Кнута в конкретной математике. А любители решить в лоб, могут решить задачу длЯ 10^100 человек. -------------------- Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором а затем стерто и которое он - пользователь не мог видеть. |
|||
|
||||
levalex |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.12.2006 Репутация: нет Всего: нет |
N - количество детей.
T - номер оставшегося N 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... T 1 1 3 1 3 5 7 1 3 5 7 9 11 13 15 1 3 ... Эксперементальным путем устанавливаем закономерность: t(1)=1 t(2*n)=2*t(n)-1 при n>=1 t(2*n+1)=2*t(n)-1 при n>=1 Если n=2^n(два в степени n)+q? где 2^m - наибольшая степень 2, не превосходящая N, a q - разность N- 2^m, то номер оставшегося ребенка вычисляется по формуле: t(2^m+q)=2*q+1 при m>=0 и 0<=q<=2^m. По крайней мере так написанов С. Окулов "Основы программирования". |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Все так, решение "в лоб" для большого числа персонажей заставит комп серьезно потрудиться. Но ведь предложенное аналитическое решение дает только номер последнего оставшегося. FireSnake же спрашивал и про то, как получить список выбывания. Предложите другой алгоритм пересортировки списка. Он, возможно, будет работать быстрее моего (я все-таки этой задачей не загружался, а предложил то, что лежит на поверхности), но все равно займет значительное время. ЗЫ: А 10^100 человек не бывает ![]() ![]() ![]() Это сообщение отредактировал(а) _Y_ - 17.12.2006, 11:44 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Плавно съехали с задачи про считалку.
5859267andrey, комбинаторика... ![]() Теперь о считалке- периодическую функцию придумай, например на основе синуса. По ней и отсеивай людей. по оси абсцисс откладывай число, а по ординат- человека. При этом sup этой функции будет равен числу людей. К примеру функция
-------------------- Всем добра ![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
вопрос по размену выделил в одну тему: http://forum.vingrad.ru/topic-127865.html
-------------------- qqq |
|||
|
||||
esperant0 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 714 Регистрация: 20.5.2005 Репутация: 4 Всего: 14 |
Идея с синусом кажется не верной. Может поделитесь доказательством, дабы убить сомнения? -------------------- Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором а затем стерто и которое он - пользователь не мог видеть. |
||||
|
|||||
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
что именно кажется не верным?
Начинаем. Синусойда высотой "количество человек". Берем, допустим её первые несколько периодов.Например от нуля до 20*pi. Делим это на количество человек. Получаем шаг. Идем с этим шагом по абсциссам и получаем ординаты. Пусть есть массив участников. Присвоим каждому целое значение на оси ординат. На каждый шаг получаем значение синусоиды. Находим промежуток целых значений, в котором лежит это значение. Вычеркиваем из массива. Так делаем пока не останется один участник. Единственная проблемма- сосчитать шаг, чтобы два значения синусоиды за два шага не попадали в один промежуток по оси ординат. Но это, ИМХО, дело техники. СУВ, SoWa -------------------- Всем добра ![]() |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
FireSnake |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 15.9.2006 Где: Украина, Донецк Репутация: нет Всего: 1 |
Что б никто не спорил относительно ограничений - вот эта задача:
on-line judge Кто получит АС поделитесь своими соображениями ![]() |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
FireSnake, я уже поделился, смотри ссылку выше. Результат работы программы:
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
FireSnake |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 15.9.2006 Где: Украина, Донецк Репутация: нет Всего: 1 |
|
|||
|
||||
Lomir |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 30.1.2007 Где: Lithuania::Kaunas Репутация: нет Всего: 1 |
Я использовал Skip-List с соотношением 10/10000.
Список из 10 элементов, а в списке масив из из 10000 элементов (чтобы ускорить удоление). Время работы где-то O(N*log n*log n) (0.671 сек).
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |