Идея точно такая же, действуем по индукции.
Обозначим S(i,j) - кол-во этажей, которое можно проверить с помощью i яиц и j бросков.
1) n=1Очевидно S(1,0)=0, S(1,1)=1,....,S(1,i)=i,....
Нужно найти наименьшее m такое, что S(1,m)>=k
m>=k
Значит, m=k.
2) n=2Возьмем m интервалов с длинами:
(1+S(1,m-1)), (1+S(1,m-2)),..., (1+S(1,1)), (1+S(1,0))
Нужно найти наименьшее m такое, что
S(2,m)=(1+S(1,m-1)) + (1+S(1,m-2)) +...+ (1+S(1,1)) + (1+S(1,0)) >= k
1) Проверим этаж (1+S(1,m-1)).
Если разбилось, то за m-1 бросков 1 яйцом проверим S(1,m-1) этажей
Итого в худшем случае: 1+(m-1)=m бросков.
2) Проверим этаж (1+S(1,m-1)) + (1+S(1,m-2)).
Если разбилось, то за m-2 бросков 1 яйцом проверим S(1,m-2) этажей
Итого в худшем случае: 2+(m-2)=m бросков.
.... и т.д..........
m-1) Проверим этаж (1+S(1,m-1)) + (1+S(1,m-2)) +...+ (1+S(1,1)).
Если разбилось, то за 1 бросков 1 яйцом проверим S(1,1) этажей
Итого в худшем случае: m-1+1=m бросков.
m) Проверим этаж (1+S(1,m-1)) + (1+S(1,m-2)) +...+ (1+S(1,1)) + (1+S(1,0))
Итого: m бросков.
Для n=2 можно получить формулу:
S(2,m) = (1+(m-1)) + (1+(m-2)) + .... + (1+1) + 1 = m(m+1)/2
Нужно найти наименьшее m такое, что m(m+1)/2>=k.
Для n=2, k=100:
13*14/2<100
14*15/2>=100
Значит, m=14.
3) n=3Нужно найти наименьшее m такое, что
S(3,m)=(1+S(2,m-1)) + (1+S(2,m-2)) +...+ (1+S(2,1)) + (1+S(2,0)) >= k
i) n=iНужно найти наименьшее m такое, что
S(i,m)=(1+S(i-1,m-1)) + (1+S(i-1,m-2)) +...+ (1+S(i-1,1)) + (1+S(i-1,0)) >= k
S(i,j)=(1+S(i-1,j-1)) + (1+S(i-1,j-2)) +...+ (1+S(i-1,1)) + (1+S(i-1,0))
Заметим, что:
S(i,j)=(1+S(i-1,j-1)) + S(i,j-1)
Теперь получается такой алгоритм вычисления:
Вычисляем ряды чисел:
S(1,0) S(1,1) S(1,2) ... S(1,j-1) S(1,j) ... S(1,k-n)
S(2,0) S(2,1) S(2,2) ... S(2,j-1) S(2,j) ... S(2,k-n) S(2,k-n+1)
...........
S(i-1,0) S(i-1,1) S(i-1,2) ... S(i-1,j-1) S(i-1,j) ... S(i-1,k-n) ............... S(i-1,k-n+i-2)
S(i,0) S(i,1) S(i-1,2) ... S(i,j-1) S(i,j) ... S(i,k-n) ............... ............... S(i,k-n+i-1)
......................................
S(n,0) S(n,1) S(n,2) ...
S(n,m-1)<k S(n,m)>=k ..........................................S(n,k)
S(i,j) равен элементу слева + элемент слева-сверху + 1
В n-м ряду остановимся, когда
S(n,m-1)<k S(n,m)>=k, m - ответ.
С программной точки зрения нужно 2 массива:
Spred длиной k+1 - S "предыдущее"
Stek длиной k+1 - S "текущее"
Псевдокод вроде этого:
Spred={0,1,2,....,k-n} // заполнить числами S(1,0), S(1,1),...,S(1,k-n)
l=k-n // номер последнего элемента
Цикл1: i=2..n
Stek[0]=0
Цикл2: j=1..l+1
Stek[j]=Stek[j-1]+Spred[j-1]+1;
Конец цикл2
Spred <-> Stek //поменять местами
l=l+1
Конец цикла1
Если интересно, то есть код программы на Java во вложении. Ответы совпали
