蓝桥杯 真题 测试次数(详解)--------Five-菜鸟级

举报
Fivecc 发表于 2022/08/06 00:54:03 2022/08/06
【摘要】                                               ...

                                                测试次数
x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。
各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7。
特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0。
如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n为了减少测试次数,从每个厂家抽样3部手机参加测试。某次测试的塔高为1000层,如果我们总是采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?请填写这个最多测试次数。注意:需要填写的是一个整数,不要填写任何多余内容。

此题 答案为19  通过关系式 (K^3+5K)/6>=1000  (下为详解)

解题思路:

  先说说题意 

    一共 1000 层   某款手机的耐摔指数 为 1~1000的任何值(超出1000 也按1000算),每款手机只有三部一模一样的手机给我们测试用 也就是说 我们最多摔坏3次 而且 最后一次摔坏的层数就是该款手机的耐摔指数。你就需要制定一个最优的方案 适用与所有不同的手机测试并且测试次数要小于等于最坏情况下的次数。(最坏情况 就是 一个边界测试次数,无论手机的耐摔指数是多少,总能在这个边界测试次数前 找到该手机的耐摔指数)

   此题 二分肯定莫法搞 只有 3部手机 ,如果 手机耐摔指数为10 你二分 先来500层 一扔 碎了 再来250层 又碎了 就剩一部手机了 咋办  你难道要扔 125 ,此时 你莫法 只有从老老实实从第一层 开始扔 才能扔到第10层测出结果,这样你就会扔 1+1+10 =12 次 ,需要测试12次 才能得到 该手机的耐摔指数,可是如果 该手机的耐摔指数为 249 哪 按照二分 就得  1+1+249=251次。所以必须另辟思路

如果 只有一部手机给你测试 哪只能 从第一层开始扔 最坏情况就是 从1扔到 1000层去,最坏情况就是1000次

如果 只有二部手机给你测试 ,这时候 就相当于多了一次机会 可以博上一博 减少点测试次数(准确的说是减少最坏情况下的测试次数),这个时候就需要假设一下了 ,最坏测试次数为 k 次  ,也就是说 无论你手机的耐摔指数为多少(1000内), 我都能通过k次测试 找到,那么想想

假设 第 1 次随便随便选一层扔 ,选 第 i_1 层 碎了,那么只好 从第1层 开始扔了 

最坏就是 耐摔指数为 i_1-1 要1+i_1-1=i_1 次测试 (同时保证  i_1<=k) 若没碎就可以进行下一步

假设 第 2 次随便随便选一层扔 ,选第 i_2 层 碎了,那么只好 从第 i_1 +1层 开始扔了

 最坏就是 耐摔指数为i_2 -1 要1+1+(i_2 -1)- i_1i_2 -i_1+1 次测试(同时保证  i_2 -i_1+1 <=k)若没碎就可以进行下一步

假设 第 3次随便随便选一层扔 ,选第 i_3 层 碎了,那么只好 从第i_2 +1层 开始扔了

 最坏就是 耐摔指数为 i_3 -1 要1+1+(i_3-1)-i_2 =i_3-i_2 +2 次测试  (同时保证  i_3-i_2 +2 <=k)若没碎就可以进行下一步

。 

假设 第 k次随便随便选一层扔 ,选第 i_k 层 碎了,那么只好 从第i_{k-1}+1层 开始扔了

 最坏就是 耐摔指数为 i_k-1 要1+1+1...1+(i_k-1)-i_{k-1}=i_k-i_{k-1}+(k-1) 次测试 (同时保证 i_k-i_{k-1}+(k-1) <=k, ) 

        然后 我们把它们 给排一排 如下 

                                                      i_1<=k

                                                    i_2 -i_1+1 <=k

                                                    i_3-i_2 +2 <=k

                                                        ......

                                             i_k-i_{k-1}+(k-1) <=k

      看到这样的 忍不住 就 想消消元 于是乎 如下

            i_1+i_2 -i_1+1+i_3-i_2 +2...... i_k-i_{k-1}+(k-1)<=k*k

                  消掉元之后: 1+2+3....+(k-1)+i_k<=k*k 

                  前面常数求和公式     k*(k-1)/2 +i_k<=k*k 

            再变一下   i_k<=k*k-k(k-1)/2  即得到  i_k<=k*(k+1)/2 

                  再一想   i_k 是第k次 扔手机 所以 这是最后一次,要保证1~1000层所有情况都考虑即i_k>=1000

                  要想测试次数k 最少 所以 i_k当然取1000 于是乎 就得到

                  当给你两部手时  在最坏情况下最小测试次数满足  k*(k+1)/2>=1000 那么k 就得出了

 现在 给的是 三部 手机,则用同样的方法 设 最坏测试次数为 K 次  ,

 假设 第 1 次随便随便选一层扔 ,选 第 i_1 层 碎了,碎了我也有2部手机不是,

那么 我此时想用两部手机测出 1~(i_1 -1)范围的耐摔指数就和上面情况一样的

最坏测试次数满足关系   k*(k+1)/2>=i_1-1= i_1-1  (同时保证  k+1<=K,===>k<=K-1注 :这是大 K  )  

 若没碎就可以进行下一步

假设 第 2 次随便随便选一层扔 ,选第 i_2 层 碎了,碎了我也有2部手机不是,

那么 我此时想用两部手机测出 (i_1 +1)~( i_2-1)范围的耐摔指数就和上面情况一样的

最坏测试次数满足关系 k*(k+1)/2>=( i_2​​​​​​​-1)-i_1 =i_2​​​​​​​- i_1-1 (同时保证  k+1+1 <=K,===>k<=K-2注 :这是大 K)

若没碎就可以进行下一步

假设 第 3 次随便随便选一层扔 ,选第 i_3层 碎了,碎了我也有2部手机不是,

那么 我此时想用两部手机测出( i_2+1)~( i_3-1)范围的耐摔指数就和上面情况一样的

最坏测试次数满足关系 k*(k+1)/2>=( i_3-1)-i_2​​​​​​​ =i_3​​​​​​​- i_2​​​​​​​-1 (同时保证  k+1+1+1 <=K,===>k<=K-3注 :这是大 K)

假设 第 k次随便随便选一层扔 ,选第 i_k 层 碎了,那么只好 碎了我也有2部手机不是,

那么 我此时想用两部手机测出(i_{k-1}​​​​​​​+1)~( i_k-1)范围的耐摔指数就和上面情况一样的

最坏测试次数满足关系 k*(k+1)/2>=( i_k-1)-( i_{k-1}​​​​​​​+1)=i_k​​​​​​​- i_{k-1}​​​​​​​ -1(同时保证  k+1+1....+1 <=K,===>k<=K-K注 :这是大 K)

  如法炮制 但是这里的小k 每行是不一样的所以要将他们 用大K 替换掉 

                                      k*(k+1)/2>=i_1-1= i_1-1                    k<=K-1

                                      k*(k+1)/2>=( i_2​​​​​​​-1)-i_1 =i_2​​​​​​​- i_1-1      k<=K-2

                                      k*(k+1)/2>=( i_3-1)- i_2​​​​​​​ =i_3​​​​​​​- i_2​​​​​​​-1       k<=K-3

                                                            ......

                                      k*(k+1)/2>=( i_k-1)- i_{k-1}​​​​​​​=i_k​​​​​​​- i_{k-1}​​​​​​​ -1    k<=K-K 

             替换后:

                                       (K-1)*K/2>=i_1-1= i_1-1

                                        (K-2)*(K-1)/2>=( i_2​​​​​​​-1)-i_1 =i_2​​​​​​​- i_1-1

                                        (K-3)*(K-2)/2>=( i_3-1)- i_2​​​​​​​=i_3​​​​​​​- i_2​​​​​​​-1

                                                                   ......

                                  (K-K)*(K-(K-1))/2>=( i_k-1)- i_{k-1}​​​​​​​=i_k​​​​​​​- i_{k-1}​​​​​​​ -1

 消消元:      1/2* [(K-1)*K+ (K-2)*(K-1)+(K-3)*(K-2)......(K-K)*(K-(K-1))]>=i_k-K

配凑法:   1/2* [k^2+(K-1)^2+ (K-2)^2+(K-3)^2......(K-(k-1))^2]-[K+(K-1)+(K-2)+(k-3)......+(K-(K-1))]>=i_k-K

              (同时增加减少 [K+(K-1)+(K-2)......(K-(K-1))]- [K+(K-1)+(K-2)......(K-(K-1))+(K-K)]  )

两边化简一下:1/2* [K^2+(K-1)^2+ (K-2)^2+(K-3)^2......1^2]-[K+(K-1)+(K-2)+(k-3)......+(K-(K-1))+(K-K)]>=i_k-K

               ===>1/2* [K^2+(K-1)^2+ (K-2)^2+(K-3)^2......1^2]-[K*(K+1)-1-2-3.....-K]>=i_k-K

根据平方求和公式  :

                      所以  原式等于 1/2*{   K*(K+1)(2K+1)/6 -[K*(K+1)-K*(K+1)/2]>=i_k-K

                      ====>1/2*{   K*(K+1)(2K+1)/6 -[K*(K+1)-K*(K+1)/2]>=i_k-K

                      ====> (K^3+5K)/6 >= i_k==1000

                      ====>  K=19

        于是就得到了 公式

  如此类推 可以得到其4部手机 5部 手机等

代码 就随便写了


  
  1. #include<stdio.h>
  2. int main(){
  3. int i;
  4. for(i=0;i<100;i++)
  5. if((i*i*i+i*5)/6>=1000)break;
  6. printf("%d\n",i);
  7. return 0;
  8. }

 

文章来源: fivecc.blog.csdn.net,作者:Five-菜鸟级,版权归原作者所有,如需转载,请联系作者。

原文链接:fivecc.blog.csdn.net/article/details/85038621

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。