鹰蛋问题
1. 若蛋只有一个 ans=m
2. 若蛋只有两个 见代码
3. 若蛋的数量超过50个 数量足够每次进行二分 见代码
4. 其他情况:
f[i][j] 表示用 i 个蛋 尝试 j 次最坏情况下所能确定的最大高度
初值 f[i][0]=0 f[0][j]=0 f[1][j]=j
转移方程 f[i][j]=f[i-1][j-1]+f[i][j-1]+1
最终要求 ans
使 f[n][ans-1]<m f[n][ans]>=m
用二分即可查找
算法时间复杂度 O(√n) 空间复杂度 O(log n)
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 #define INF 0x3f3f3f3f 7 #define N 55 8 #define M 50050 9 10 int n,m; 11 int f[N][M]; 12 13 int main() { 14 scanf("%d%d",&n,&m); 15 if (n==1) { 16 printf("%d",m); 17 return 0; 18 } 19 if (n==2) { 20 int x=(int)sqrt(m)-1; 21 while (1) { 22 if (x*(x+1)>=m*2) { 23 printf("%d",x); 24 return 0; 25 } 26 x++; 27 } 28 } 29 if(n>=50) { 30 int ans=0; 31 while (m>0) { 32 m>>=1; ans++; 33 } 34 printf("%d",ans); 35 return 0; 36 } 37 for (int i=0;i<N;i++) f[i][0]=0; 38 for (int i=0;i<M;i++) { 39 f[0][i]=0; 40 f[1][i]=i; 41 } 42 for (int i=2;i<N;i++) { 43 for (int j=1;j<M;j++) { 44 f[i][j]=f[i-1][j-1]+f[i][j-1]+1; 45 if (f[i][j]>=INF) f[i][j]=INF; 46 } 47 } 48 int ans=lower_bound(f[n],f[n]+M,m)-f[n]; 49 printf("%d",ans); 50 }