Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: Знаешь игру считалку? Есть n человек, выбывает каждый m , и так пока не останется один человек Умею решать ее до n=500 m=100 А можно ее как нибудь решить при n=10000?
1
  1  Присяжнюк Анатолий Васильевич, 03 сентября 2009 г. 20:46:45
      Решаема, только смотря каким алгоритмом :)

Вообще, эта задача в классной редакции (нужно поискать исходник условия у меня в архиве - руки не доходят из-за нехватки времени :) ) была в свое время на прекрасном белорусском проекте ttb.by, к сожалению, почему-то закрытом.

Кто желает порешать эту задачу для больших значений, смотрите, например, задачку http://acm.pku.edu.cn/JudgeOnline/problem?id=2939 - там ограничения довольно большие (условие - на английском, ввод-вывод - консольный).

В классике эта задача встречается в разных вариантах и является классической и очень полезной с точки зрения постоянного поиска путей оптимизации алгоритмического решения для заданных в конкретной задаче ограничений или нюансов.

Предложение к Админу - может подумать о тематической олимпиаде на эту тему?
Если нужно - готов помочь.
  2  Нагин Сергей Юьевич, 03 сентября 2009 г. 14:42:55
      для М=2 , она решаема и для 1000000000!)
  3  Прищенко Богдан Олегович, 03 сентября 2009 г. 0:13:50
      Спасибо:)
  4  Присяжнюк Анатолий Васильевич, 03 сентября 2009 г. 0:08:34
      На украинском портале дистанционного обучения (Винница - Пасихов Ю.Я. - http://disted.edu.vn.ua/ ) есть разбор этой задачи (жаль, что только на украинском языке).
  5  Прищенко Богдан Олегович, 02 сентября 2009 г. 22:05:33
      Погуглил, ознакомился с темой... Код на паскале - лобовик, его в топку... На с++ - более-менее нормальное решение. При больших ен задача толком не решается, если ем тоже достаточно большое... там, где я ее видел с ограничением 100000000 действительно было довольно маленькое ем, при большом шаге щиталки она, если верить инфе с сети, неразрешима в пределах нескольких секунд.
  6  Мехрдоди Одил (ТРГИ), 02 сентября 2009 г. 21:35:16
      Прищенко Богдан Олегович, 02 сентября 2009 г. 20:47:26
в его решении на с++, КАК РАЗ и ИСПОЛЬЗУЕТСЯ СТАНДАРТНАЯ ФОРМУЛА.
  7  Прищенко Богдан Олегович, 02 сентября 2009 г. 20:56:44
      в украинской википедии в статье о задаче есть формулы, кому надо - смотрите.
  8  Прищенко Богдан Олегович, 02 сентября 2009 г. 20:51:39
      Ага, отгуглил. Решение с вики для ограничений 500. Для больших формула есть в сети, искать надо, я пока этого еще не осваивал, руки не дошли, всегда надеюсь не нарваться на эту задачу:)
  9  SKYDOS, 02 сентября 2009 г. 20:49:23
      Прищенко Богдан Олегович, 02 сентября 2009 г. 20:47:26

здесь типа написано "Взято с википедии"...))) код не мой сразу говорю)
  10  Прищенко Богдан Олегович, 02 сентября 2009 г. 20:47:26
      SKYDOS, а что здесь вообще написано? Я вижу только убийственное решение лобовиком:) Акашаев, при н=10000 должен и лобовик проходить. А при полноценных ограничениях, например, 10 миллионов, или же при обратной "переборной" задаче никакой оптимайз лобовика не спасет. Надо просто юзать стандартную формулу.
  11  Акашаев Нурлан Амангельдиевич, 02 сентября 2009 г. 19:57:46
      Спасибо!
  12  SKYDOS, 02 сентября 2009 г. 19:39:24
      С++
int joseph (int n, int k) {
return n ? (joseph (n-1, k) + k - 1) % n + 1 : 1;
}

Паскаль
program TheJosephusProblem;
uses
SysUtils;
const nmax=500;
var mass:array[1..nmax] of integer;
i,j,m,n: integer;
begin
read(n,m);
for i:=1 to n do
mass[i]:=i;
i:=1;
while n>1 do begin
i:=(i+m-1) mod n;
if i=0 then i:=n;
for j:=i to n-1 do
mass[j]:=mass[j+1];
n:=n-1;
end;
writeln(mass[1]);
end.
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru