双杯问题探求

一种杯子,若在第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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值