Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

Воскресные задачки   Найти похожие ветки 

 
Vasya.ru ©   (2005-02-27 00:59) [0]

Прошлые задачки оказались легкими для местных мастеров, выкладываю еще 2 задачи чуть посложнее

1. Кодировка.
Общеизвестны два самых простых метода кодировки: метод подстановки и метод перестановки. Первый заключается в том, что каждую букву в исходном слове мы заменяем на какую-то (возможно другую) букву. Например из слова HEHE ,  заменив E на O, а H на T, мы получаем слово TOTO. Второй состоит в том, что буквы в слове переставляются в произвольном порядке (например OMON -> NOOM). Оба метода легко дешифруются и поэтому чаще всего применяются совместно - то есть сначала к слову применяется первый, а затем второй. Нужно определить, можно ли таким преобразованием получить из одного слова другое.
Прим. слова состоят только из больших латинских букв, не длинее 100 символов

2. Мартышка и орехи.
Мартышка, в кармане которой лежит K орехов, бегает по N-этажному зданию. Бросая орехи из окон здания, она решила экспериментально определить ореховый коэффициент - минимальный этаж, начиная с которого орехи разбиваются. Бросив орех с какого-то выбранного ею этажа, она наблюдает за тем, разбился он или нет. Если он разбился, он уже не пригоден для дальнейших экспериментов, а если нет - она спускается и подбирает его. Затем она выбирает еще этаж и бросает оттуда и т.д. Требуется найти минимальное количество попыток, за которое мартышка гарантированно решает свою задачу при любом ореховом коэффициенте. Обратите внимание, что здание может оказаться недостаточно высоким, и орехи не будут разбиваться вообще.


 
DiamondShark ©   (2005-02-27 01:18) [1]

По второй могу пока сказать, что не больше N/2.
Точнее не могу -- спать охота.


 
QuasiLamo ©   (2005-02-27 01:19) [2]

в одном месте собрали 2005 самых умных ученых, чтобы подвергнуть испытанию. Им сказали, что их поставят в ряд друг за другом, на каждого из них наденут колпаки(либо красный, либо синий). При этом самый первый ученый будет смотреть в затылок второму, второй в затылок третьему и т.д. Таким образом, первый будет видеть всех, последний - никого из своих соратников. Каждый ученый в отдельности не сможет без посторонней помощи узнать цвет своего колпака, проще говоря, он его не увидит. Напоследок им сказали, что задача каждого из них будет состоять в том, чтобы правильно выкрикнуть цвет колпака, надетого на нем. Считается, что каждый из ученых в процессе испытания будет слышать то, что кричит любой из его соратников. Право голоса в процессе испытания каждому из ученых дается один раз, и выкрикнуть он может только одно из двух слов: "красный" или "синий", и это будет считаться цветом его колпака. Если ученый правильно назвал цвет своего колпака, значит, он справился с задачей.
А теперь, собсно вопросы:
1. Какая тактика должна быть выбрана учеными, чтобы максимальное количество назвало правильный цвет своих колпаков?
2. Сколько гарантированно правильных ответов будет получено при этом?


 
QuasiLamo ©   (2005-02-27 01:27) [3]

Vasya.ru ©   (27.02.05 0:59)
2. вроде, если я прально понял условия, (log(N) по осн. 2) - минимальное количество попыток при наихудшем стечении обстоятельств(при использовании бинарного поиска). Я вот только не пойму, зачем дано K?


 
GuAV ©   (2005-02-27 01:40) [4]

1.
type
 TLetterCount = array["A".."Z"] of Byte;

function CountLetters(const S: string): TLetterCount;
var C: Char; I: Integer;
begin
 FillChar(Result, SizeOf(Result), 0);
 for C := Low(Result) to High(Result) do
   for I := 1 to Length(S) do
     if S[I] = C then Inc(Result[C]);
end;

function CompareLettersCount(const L1, L2: TLetterCount): Boolean;
var C: Char; I, J: Integer;
begin
 J := 0;
 for I := 1 to 100 do
 begin
   for C := Low(TLetterCount) to High(TLetterCount) do
   begin
     if L1[C] = I then Inc(J);
     if L2[C] = I then Dec(J);
   end;
   if J <> 0 then
   begin
     Result := False;
     Exit;
   end;
 end;
 Result := True;
end;

function CanBeConverted(const S1, S2: string): Boolean;
begin
 Result := CompareLettersCount(CountLetters(S1), CountLetters(S2));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := BoolToStr(CanBeConverted(Edit1.Text, Edit2.Text), True);
end;


QuasiLamo ©   (27.02.05 1:27) [3]
Я вот только не пойму, зачем дано K?

Орехов должно хватить. Так, если К = 1, то нужно идти только сверху по одному вниз, т.е. ответ равен N. Если 1 < K << N то cложнее...


 
GuAV ©   (2005-02-27 01:48) [5]

GuAV ©   (27.02.05 1:40) [4]
только сверху по одному вниз

наоборот, снизу вверх.


 
Alex_Petr ©   (2005-02-27 02:03) [6]

QuasiLamo ©   (27.02.05 1:19) [2]
Гарантированно: 2004.
Красный: четное количество красных, синий - нечетное.


 
GuAV ©   (2005-02-27 02:11) [7]

1.
Немного оптимизировал
function CountLetters(const S: string): TLetterCount;
var I: Integer;
begin
 FillChar(Result, SizeOf(Result), 0);
   for I := 1 to Length(S) do
     if S[I] in ["A".."Z"] then
       Inc(Result[S[I]]);
end;

2.
Про мавпу - искать бинарным поиском до последнего ореха, а потом по одному вверх ?


 
GanibalLector ©   (2005-02-27 02:15) [8]

2 QuasiLamo ©   (27.02.05 01:19) [2]
Это уже было,правда в другой интерпритации.Jack128 баловался!


 
QuasiLamo ©   (2005-02-27 05:37) [9]

GanibalLector ©   (27.02.05 2:15) [8]
Alex_Petr ©   (27.02.05 2:03) [6]
это из олимпиадных заданий


 
Vasya.ru ©   (2005-03-02 16:26) [10]

GuAV ©   (27.02.05 2:11) [7]
2.
Про мавпу - искать бинарным поиском до последнего ореха, а потом по одному вверх ?

Бинарный поиск - не самое быстрое решение, так например при N = 10, K = 2 бинарным поиском понадобится сделать 5 бросков орехов, а можно сделать за 4


 
default ©   (2005-03-02 17:26) [11]

решение для 2 я видел в нете, там для 100 этажей и 2 стёклышек
там говорится и обобщение на K стёкол
есть что-нибудь другое?


 
Fay ©   (2005-03-02 17:48) [12]

2 - решения не существует, т.к. (в общем случае) мартышка бегает по зданию, высота которого меньше необходимой для орехокрушения. Т.о. гарантированного решения нет - она ведь может 4308974350698743943586 раз кидать каждый орех с последнего этажа и не разбить ни одного 8)


 
Fay ©   (2005-03-02 17:49) [13]

2 - решение может быть в том случае, когда орехи аккумулируют дамаги.


 
Vasya.ru ©   (2005-03-02 18:02) [14]

Fay ©   (02.03.05 17:48) [12]
Не понял тебя. Задача мартышки не разбить орех, а найти этаж, начиная с которого орехи разбиваются.
default ©   (02.03.05 17:26) [11]
Ссылку не вспомнишь?


 
default ©   (2005-03-02 18:11) [15]

Vasya.ru ©   (02.03.05 18:02) [14]
" Вы находитесь в 100-этажном здании, а в руках у Вас две стеклышка. Вы знаете, что выбросив стекло с этажа H или выше, оно разобьется, упав на землю. Если же Вы выбросите его с этажа H-1 или ниже, с ним ничего при падении не случится. Вы можете спуститься на нижний этаж, подобрать стекло, если оно не разбилось и использовать его заново. Каков алгоритм, с помощью которого можно определить число H за минимальное число шагов?

Ответ: Решение Константина Кнопа:
 Замечание 1.
 Можно было бы формулировать задачки и почетче.
 Следствие.
 Эта задача допускает несколько разных пониманий.

 Я приведу решение, которое относится вот к какому пониманию: 1) шагом называется одна попытка бросания стеклышка 2) ищется алгоритм, который ЗАВЕДОМО укладывается в некое число шагов, независимо от того, каким именно окажется число H. Иными словами, если обозначить f(H) число шагов, необходимое для того, чтобы алгоритм закончил работу в случае, когда "ответом" служит H, то ищется алгоритм, минимизирующий max f(H) по всем H от 1 до 100.
 Почти очевидно, что этот алгоритм должен быть в общих чертах следующим: сначала кидается первое стеклышко с этажей a1 < a2 < ... < ak - до тех пор, пока оно не разобьется. После этого (известно, что для этажа a_m стеклышко еще не разбивалось, а для этажа a_{m+1} уже разбилось) запасного стеклышка уже нет, поэтому второе стеклышко приходится кидать подряд по всем этажам от 1+a_m до a_{m+1}-1 включительно. Такой алгоритм требует (m+1) шагов для первого стеклышка и не более чем (a_{m+1}-1-a_m) шагов для второго стеклышка (худшим случаем, очевидно, будет тот, когда второе стеклышко придется кидать со всех этажей, то есть оно не разобьется вплоть до (a_{m+1}-1)-го этажа.
 Если мы хотим, чтобы max f(H) по всем H был ограничен сверху величиной N, то это требует соблюдения неравенств
a_{m+1}-1-a_m + m + 1 <= N
 при всех m. Так как a_0=0, то это означает, что
a_1 <= N,
a_2 - a_1 <= N-1,
a_3 - a_2 <= N-2,
.................
a_N - a_{N-1} <= 1
 При этом алгоритм позволяет полностью "пройти" здание, в котором a_N этажей (и не больше, потому что если первое стеклышко не разбилось даже при N-м шаге, то все попытки уже исчерпаны).
 Выписанную систему неравенств можно почленно сложить и получить почти очевидное неравенство
a_N <= N(N+1)/2.
 Поскольку нам нужно пройти 100-этажный дом, то необходимо выполнение неравенства 100 <= N(N+1)/2, а так как хочется минимизировать N, то нужно взять наименьшее из натуральных значений N, удовлетворяющих этому неравенству, то есть N=14.
 На этом доказательное теоретизирование заканчивается и начинается голая практика.
 Все вышесказанные рассуждения приводят к очень естественному и простому алгоритму бросаний: кидаем стеклышко последовательно с 14-го, 27-го, 39-го, 50-го, 60-го, 69-го, 77-го, 84-го, 90-го, 95-го, 99-го и 100-го этажей, пока оно не разобьется. Как только стеклышко разбилось, кидаем второе стеклышко по всем промежуточным этажам от последней "удачной" пробы и выше. Это гарантирует, что для любого H результат будет получен не более чем на 14-м ходу. Доказательство оптимальности представлено выше.

 Замечание 2.
 100 - "неправильная" высота дома для данной задачи. Было бы более красиво взять, скажем, 120-этажный дом.
 Замечание 3.
 Мне неизвестен алгоритм, который решает эту задачу в другом понимании - когда требуется минимизировать СРЕДНЕЕ число шагов-попыток (при естественном допущении, что все H равновероятны в качестве ответа). Иными словами, я не умею минимизировать сумму f(H) по всем H от 1 до 100.
 Замечание 4.
Задача допускает обобщение (не очень сложное) на три, четыре и большее число стеклышек. Там в алгоритме естественно возникают биномиальные коэффициенты C_N^3, C_N^4 и т.п."



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.038 c
1-1109924793
Alexandre
2005-03-04 11:26
2005.03.20
Скрытие формы


14-1109577221
boriskb
2005-02-28 10:53
2005.03.20
Для тех, кому приходится набирать сотрудников в soft компанию.


4-1107445405
Lucifer
2005-02-03 18:43
2005.03.20
Как отследить какие пользователь нажал кнопки на клаве?


14-1109263189
JaVa73
2005-02-24 19:39
2005.03.20
Мюзикл Moulin Rouge


1-1110304064
vertal
2005-03-08 20:47
2005.03.20
Аналог DecimalSeparator для writeln





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский