[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Еще задачки 2
Страницы: 1, 2, 3, 4, 5, 6
OleKh
Цитата (Cognio @ 16.02.2015 - 12:23)
Свернутый текст
x - этаж с которого оптимально бросать
x, x+x-1, x+x-1+x-2, ... => x+(x-1)+(x-2)+(x-3) >= 100
=> оптимальный x = 14
Сначала кидаем с 14, если не разбился кидаем с x2 = 14 + 13 = 27, x3 = 27 + 12 = 39 ...
В худшем случае нужно 14 бросков.


UPD. Первый семестр динамического программирования.

А кто понял что тут за матерщина) ?

x, x+x-1, x+x-1+x-2, ...
=> x+(x-1)+(x-2)+(x-3) >= 100 //почему не x+(x-1)+(x-2)+(x-3)+(х-4)
=> оптимальный x = 14 // x+x-1+x-2+x-3 = 100 => 4x = 100 +1+2+3 => 4x= 106 =>x = 106/4=> x = 26,5

Alchemist
Я был уверен, что все уже посмотрели решение в и-нете, но поскольку это видимо не так, то публикую подробное решение.

Формальный ход решения и ответ на задачу:

Свернутый текст
Для начала берем самый простой алгоритм, который я уже дал в примере в задаче - перебор этажей с первого по сотый. В худшем случае потребуется 99 попыток, и второе яйцо вообще не используется.

Как же можно использовать преимущество дополнительного яйца?
Очевидный вариант - разбить 100 этажей на несколько примерно равных групп; бросать первое яйцо с максимального этажа в каждой группе до тех пор пока оно не разобьется, и после этого с помощью второго яйца перебрать все остальные этажи только внутри этой группы.

Например: разбиваем дом на четыре группы по 25 этажей (1-25, 26-50, 51-75 и 76-100 этажи). Бросаем яйцо с верхнего этажа первой группы (25 этаж):
- если разбилось, значит искомый этаж ниже или равен 25, и с помощью второго яйца начинаем перебирать этажи с 1 по 24.
- если яйцо осталось целым, то значит искомый этаж выше 25-го, и мы переходим к следующей группе (26-50 этажи), бросая яйцо с максимального этажа уже в ней - с 50-го этажа.
-- если разбилось, то перебираем этажи 26-49
-- если осталось целым, переходим к следущей группе
и т.д.
Поскольку в каждой группе по 25 этажей, и есть всего 4 группы, то максимальное кол-во бросков не превысит 27 (24 + 3).
(мы предполагаем что яйцо обязательно бьется на каком-то этаже, поэтому нет смысла проверять 100-й этаж. Поэтому (24 + 3), а не (24 + 4))

Далее, легко посчитать, что разбив дом на 5 групп по 20 этажей мы снизим максимальное кол-во бросков до 23. Продолжая уменьшать размер группы мы скоро обнаруживаем, что группа размером 10 этажей дает максимум в 18 бросков, а дальнейшее уменьшение размера групп приводит обратно к увеличению их кол-ва.

Можно ли улучшить этот результат?

Можно.
Проблема в делении на равные группы именно в том что группы равны. Вне зависимости от того, сколько бросков мы уже потратили на поиск "правильной" группы, нам все равно может понадобиться еще (Х - 1) бросков чтобы найти правильный этаж внутри группы.

Пример: при размере группы в 10 этажей, если первое яйцо разбилось уже после первого же броска с 10-го этажа, то нам нужно еще максимум 9 бросков чтобы найти правильный этаж (всего будет 10). Но при этом, если первое яйцо разбилось только при броске с 90-го этажа, то мы уже сделали 9 бросков, и нам по-прежнему нужно до 9-ти бросков чтобы проверить этажи 81-89...

Эта проблема решается использованием алгоритма "уменьшающихся" групп. Пусть каждая следущая группа будет на 1 этаж меньше предыдущей. Тогда тратя лишний бросок, чтобы "добраться" до нужной группы, мы будем экономить его при переборе самой группы !

Пример: пусть первая группа будет размером 10 этажей (этажи 1-10). Следуя тому же алгоритму что и раньше - кидаем первое яйцо с 10-го этажа.
- если разбилось, перебираем этажи с 1-го по 9-й. Всего нам понадобится не больше (1 + 9) <= 10 бросков.
- если осталось целым, переходим к следущей группе, но уменьшаем размер группы на 1 этаж, т.е. следущая группа будет 11-19 (9 этажей), а не 11-20 (10 этажей) как в предыдущем алгоритме. Кидаем яйцо с верхнего этажа группы (19):
-- если разбилось, то перебираем этажи с 11 по 18 (8 этажей). Всего будет не больше (2 броска для определения группы + 8 этажей) <= опять 10 бросков !
-- если осталось целым, то переходим к следущей группе, но опять уменьшаем размер на 1 этаж: 20-27 (8 этажей). Кидаем яйцо с 27 этажа:
--- если разбилось, то перебираем этажи 20-26 (3 "групповых" броска + 7 этажей) и опять не больше 10 бросков !
--- если осталось целым, повторяем алгоритм...

Нетрудно увидеть, что при таком алгоритме, максимальное число бросков для любой группы не превышает лимита, которым является размер начальной (самой большой) группы.

Осталось найти этот самый подходящий размерчик (главное чтобы костюмчик сидел!). Это тоже не трудно. Пусть первая группа будет размера Х. Очевидно, что минимальная группа - 1 этаж, и всего нам надо покрыть 100 этажей, значит нам надо подобрать Х таким, чтобы:

Х + (Х-1) + (Х-2) + ... + 2 + 1 >= 100
(разумеется нам нужен минимальный Х отвечающий требованиям)

Поскольку операция сложения комутативна, перевернем выражение:
1 + 2 + ... + (Х-2) + (Х-1) + Х >= 100

Калькулятор в руки и вперед:
1 + 2 + 3 + ... + 13 + 14 = 105 - первая сумма превышающая 100.

Значит размер первой группы, и максимальное кол-во бросков необходимых для поиска правильного этажа равно 14.

Спасибо за внимание smile.gif

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.