一种杯子,若在第N层被摔破,则在任何比N层高的楼层均会破;若在第M层不破,则在任何比M层低的楼层均不会破。给你2个这样的杯子,让你在100层高的楼层中测试,请问在最坏情况下,确定该楼层所需的最小尝试次数。(用最少的测试次数找出恰好会使杯子破碎的楼层。)
最坏情况最小次数k
- 第一轮:第一次,从第 x1 层扔下第一个杯子:
若碎了:需用第二个杯子从第 2层到 x1-1 层逐次测试,最多还需 x1-2<k 次。
若没碎:问题转化为剩余 n - x1 层楼,且剩余尝试次数为 k-1 次。
第二轮:第二次,从 x1 + x2 层测试。碎了,从x1+1层到x1+x2-1层逐一测试,剩余次数为 x2-2<k-1 。
没碎,问题转化为剩余 n - x2 层楼,且剩余尝试次数为 k-2次。
递推规律:每轮测试的楼层间隔应依次递减 1,确保每轮的最大剩余次数等于当前剩余尝试次数。
- 第 i 轮:第i次:从x1+...+xi层测试后,剩余次数xi-i<(k - i + 1) ,为xi<k+1。
第k轮:第k次
x1+...+xi要大于等于100,且100<k*i+1。
即 int x=0,k=1,a[101],b[50]= {0};
for(x=0; x<N; x++)a[x]=x;
x=1;
while(b[k-1]<=N)
{
b[k]=a[k]+b[k-1];
k++;
}
k=k-1;
printf("%d\n",k);