提议
近日,埃航空难的新闻牵动了无数人的心。
据悉,空难很可能是由于波音737MAX飞机的失速保护系统错误触发所致。
在飞机进行高空飞行时,驾驶辅助系统如果检测到飞机失速,无法维持足够的飞行升力,会压低机头进行俯冲,以重新获得速度,进而获取足够的飞行升力,维持飞行高度。
但是在飞机进行低空飞行时,触发俯冲机制极有可能在飞机还未获得足够飞行速度并上升之前已经撞击地面。
鉴于半年内的两起事故,波音公司决定在低于一定高度时屏蔽自动俯冲机制,现提供K架飞机用于测试最低可俯冲高度,设定需要测试的海拔范围为1~H(单位米)(注意:测试高度只从整数中选取),请问最不理想情况下,至少需要多少次才能求出飞机的最低可俯冲高度?
输入格式
输入为整数K, H,用空格分隔。
K代表用于测试的飞机数量,H代表需要测试的高度范围为1~H米(包含H)。
输出格式
输出整数N,代表最坏情况下需要测试的次数。
数据范围
1≤K≤20
1≤H≤1000
输入样例1:
1 1000
输出样例1:
1000
输入样例2:
15 1000
输出样例2:
10
样例解释
在样例#1中,只有一架飞机用来测试的情况下,从最高高度1000米,逐次减1m进行测试,直到飞机坠毁。
在样例#2中,飞机数量足够多,每次均使用二分法进行测试。
说明
1-H为低空飞行高度范围,所有大于H的高度都不属于低空飞行,不会在俯冲过程中撞击地面,不需要进行测试。
如果飞机俯冲测试过程中撞击地面坠毁,可以推断本次测试高度低于飞机实际最低可俯冲高度,可测试飞机数量减1。
如果飞机俯冲测试过程中撞击地面前顺利拉升,可以推断本次测试高度高于或等于飞机最低可俯冲高度,本次试验所用飞机可继续用来测试。
相同题意
lis=list(map(int,input().split()))
m,n=lis[0],lis[1]
N=1010
M=21
f=[[0]*M for i in range(N)]
# 边界两种情况
#1.只有一米的高度
for i in range(1,m+1):
f[1][i]=1
# 2.只有一架飞机
for i in range(1,n+1):
f[i][1]=i
# 状态
#从第k米飞,第一种飞机出事1+f[k-1][j-1] k-1表示从下面的米数找没出事的事故,1表示这一次,j-1表示前面j-1个飞机
#第二种飞机没出事,从i-k里面找最优解,j就代表这次没出事
for i in range(2,n+1):
for j in range(2,m+1):
#初始
f[i][j]=f[i][j-1]
for k in range(1,i+1):
f[i][j]=min(f[i][j],1+max(f[k-1][j-1],f[i-k][j]))
print(f[n][m])