#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 返回最差情况下扔棋子的最小次数
# @param n int整型 楼层数
# @param k int整型 棋子数
# @return int整型
#
import math
class Solution:
def solve(self , n , k ):
# write code here
if n < 1 or k < 1: return 0
if k == 1: return n # 若只有一个棋子
if n == 1: return 1 # 若只有一层楼
times = int(math.log(n)/math.log(2)) + 1 # 完全二分需要用的次数(最理想情况)
if k > times: return times # 若棋子数多于完全二分需要用的次数
dp = [0] * k
res = 0
while True:
res += 1
prev = 0
for i in range(k): # 更新一颗棋子可能达到的最高层数
tmp = dp[i]
dp[i] += prev + 1
prev = tmp # prev更新为上一轮dp[i]的最高层数
if dp[i] >= n: # 若当前dp[i]已经达到总楼层数n,则返回扔的最小次数
return res