面筋分类汇总-测开向
目录
- 数字拼凑问题
- 上山下山问题
- 称重找不同问题
- 水桶分水问题
- 两头点燃计时问题
- 顺序拿最后取胜问题
- 大数据量取最值问题
- 飞机加油问题
- 两颗鸡蛋测临界楼层的问题
- 循环赛根据比赛局数推导第二场输家的问题
- 小老鼠喝毒药/快速核酸检测问题
数字拼凑问题
-
题目:两个4,两个10,利用加减乘除怎么最后得到24
- 正规方法:(10×10-4)÷4=24
- 投机取巧:44-10-10=24
上山下山问题
-
题目:
- 上山(早8晚8)下山(早8晚8),问会不会两天的同一时间出现在同一地点
-
分析:
- 解答:解:存在一个地点,此人在上山过程中到达该点的时刻与下山过程中到达该地点的时刻相同.
- 可以从函数图象的角度理解.比如令横轴为时间(早晨8点到傍晚7点),令竖轴为从山下到山上的路程.这样我们就可以在平面直角坐标系上框出一个长方形范围.则第一天他的图象可以理解为从左下角(从起点上山)不规则地向右上角(山顶)延伸(即随时间推移他从山下往山上走).而第二天他的行程可以理解为从左上角(从山顶下山)不规则地向右下角延伸.这样的话这两天的图象必然会有相交的地方,那么交点的意义就是他在这两天的这个同一时刻在路程中的同一个地方,据此即可解答.
称重找不同问题
-
题目:
- 10个堆,每堆10个苹果,其中9个堆里苹果是50g/个,一个堆里苹果是40g/个,有一杆秤只能称一次,所称重量为x,求40g苹果所在堆。
-
分析:
- 将堆编码为1-10;然后每堆拿出k个,最后少了k*10克,则知道是第几堆的苹果。
-
题目:
- 八个球,其中有一个是其余球重量的1.5倍,有什么方案找出来
-
分析:
- 分为3+3+2 三组
- 先称3和3的两组,找出多的一边继续分为三组,用相同方法称;
- 如果3和3的两组相等,则目标在剩余两个球中,将这两个球称一下就可以找出目标了。
- 最慢3次,最快1次(即任取两个球,称,看运气)
水桶分水问题
-
题目:
- 5L和6L水桶,得到三升水。
-
分析:
- 1、6L的水桶装满水,倒满5L的桶。 2、将5L桶里的水倒了,将6L桶里剩余的1L放入5L桶。 3、6L的桶装满水,倒满5L桶里,6L桶里还剩2L(6-4)水。 4、 将5L桶里的水倒了,将6L桶里剩余的2L水放入5L桶里。 5、将6L桶装满水,倒满5L的桶,这时6L的桶里还剩3L水。
-
题目:
- 4分钟沙漏和7分钟沙漏怎么漏出9分钟
-
分析:
- 4分钟的和7分钟的同时开始,4分钟的完后又倒过来开始。7分钟的沙漏完后立马倒过来,(4分钟的沙漏还剩1分钟)。等4分钟的沙漏完后,将7分钟的又立马倒过来,等漏完就是9分钟。
- 注:4分钟两次,一共8分钟;差值创造的1分钟最后漏回7分钟沙漏里,一共9分钟。
两头点燃计时问题
-
题目:
- 两个一小时蚊香怎么得到15分钟的记时
-
分析:
- 同时点燃AB两只蚊香,其中A蚊香点燃两头,等A蚊香烧完后(30分钟),点燃B蚊香的另一头。
顺序拿最后取胜问题
-
题目:
- 桌上100个球,每次可以拿一到五个, 现在我们两个人依次拿球,你先拿,使用怎样的拿球策略,可以使你最终能拿到最后一个球?
-
分析:
- 两人一组,可控一次拿6个球,100整除6,取余4,因此可以先拿4个球,剩余的数量是6的整数倍。
- 第一次拿四个,后来每个你拿球的时候只要保证剩下的球是6的倍数就行了如果他拿n个球 ,你就拿6-n个球。
-
题目:
- 有10个石头,每人每次可以拿1-2个,轮流拿,最后一个拿的人算输,有什么必赢的方案。
-
分析:
- 两人一组,可控一次拿3个石头。10整除3,取余1,因此去掉余数1个,剩余数量是3的整数倍。
- 对方先拿、保证两个人每一轮回拿满3个(对方拿一个,我拿两个、对方拿两个,我拿一个)。
- 注:本题是上一个题的逆向,即先保证拿完整数倍,剩余1个(余数是别的就不行了),对面只能拿,因此会输。
大数据量取最值问题
-
题目:
- 一亿数据获取前100个最大值
-
分析:
- 小根堆的思想:
- 注:相比红黑树,小根堆更快。
- 把一亿个数字的前100个 首先放入数组,然后把最小值放在ary[0]。
- 然后再循环100到一亿之间的。每次循环判断当前数字是否大于ary[0],当大于时,当前数字放入ary[0],并再次重构数组最小值进入ary[0]以此类推 。
- 当循环完这一亿个数字后,最大的前100个数字就出来了。
- 小根堆的思想:
飞机加油问题
-
题目:
- 每个飞机只有一个油箱,飞机之间可以相互加油,注意是相互,没有加油机,一箱油可供一架飞机绕地球飞半圈。
- 问题:
- 为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?
- A:所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场
- B:所有飞机从同一机场,同一方向起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场
-
分析:
- 至少需要三架飞机。(两架飞机是显然不可能的,这个都不用说什么)。前提假设当然是:加油、掉头、降落和起飞的时间分别是0。
- 一架飞机=半圈,一直向前;加油机交替折返,相互加油;目标机飞过半圈之后,加油机从相反的方向去接。
-
- 三架飞机同时从机场O起飞,方向为顺时针,此时三架飞机的油量分别是:A: 1, B: 1, C: 1。
- 三架飞机同时从机场O起飞,方向为顺时针,此时三架飞机的油量分别是:A: 1, B: 1, C: 1。
-
- 当A飞行至半圈的1/4位置时,此时飞机的油量分别是:A: 3/4, B: 3/4, C: 3/4。此时C分别给A和B加满油,三架飞机当前油量分别是:A: 1, B: 1, C: 1/4。C返回机场。A、B继续向前飞行
- 当A飞行至半圈的1/4位置时,此时飞机的油量分别是:A: 3/4, B: 3/4, C: 3/4。此时C分别给A和B加满油,三架飞机当前油量分别是:A: 1, B: 1, C: 1/4。C返回机场。A、B继续向前飞行
-
- 当A飞行至半圈的1/2位置时,此时C已经返回机场,三家飞机此时油量分别是:A: 3/4, B: 3/4, C: 0。此时B给A加满油,C加满油,此时三架飞机的油量分别是:A: 1, B: 1/2, C: 1。然后B返回机场,A继续向前飞行。
- 当A飞行至半圈的1/2位置时,此时C已经返回机场,三家飞机此时油量分别是:A: 3/4, B: 3/4, C: 0。此时B给A加满油,C加满油,此时三架飞机的油量分别是:A: 1, B: 1/2, C: 1。然后B返回机场,A继续向前飞行。
-
- 当A飞行至半圈位置时,B已经返回机场并且加满了油(假设加油时间为0),此时,B和C沿逆时针方向飞行,三架飞机当前油量分别是:A: 1/2, B: 1, C: 1。A继续向前飞行。
- 当A飞行至半圈位置时,B已经返回机场并且加满了油(假设加油时间为0),此时,B和C沿逆时针方向飞行,三架飞机当前油量分别是:A: 1/2, B: 1, C: 1。A继续向前飞行。
-
- 当A飞行至另外半圈的1/4位置时,三架飞机剩余油量分别是:A: 1/4, B: 3/4, C: 3/4。此时,C给B加满油。此时三架飞机油量分别是:A: 1/4, B: 1, C: 1/2。C返回机场,B和A继续向前飞行。
- 当A飞行至另外半圈的1/4位置时,三架飞机剩余油量分别是:A: 1/4, B: 3/4, C: 3/4。此时,C给B加满油。此时三架飞机油量分别是:A: 1/4, B: 1, C: 1/2。C返回机场,B和A继续向前飞行。
-
- 当A飞行至另外半圈的1/2位置时,C已经返回机场,A和B相遇,此时三架飞机剩余油量分别是:A: 0, B: 3/4, C: 0。B给A加1/4的油,三架飞机剩余油量:A: 1/4, B: 1/2, C: 1。C加满油从机场逆时针飞出,B返回机场,A继续向前飞行。
- 当A飞行至另外半圈的1/2位置时,C已经返回机场,A和B相遇,此时三架飞机剩余油量分别是:A: 0, B: 3/4, C: 0。B给A加1/4的油,三架飞机剩余油量:A: 1/4, B: 1/2, C: 1。C加满油从机场逆时针飞出,B返回机场,A继续向前飞行。
-
- 当A飞行至另外半圈的3/4位置时,A和C相遇。此时三架飞机的油量分别是:A: 0, B: 1/4, C: 3/4。C给A加1/4的油,此时三架飞机的油量分别是:A: 1/4, B: 1/4, C: 1/2。C掉头返回机场,A和B继续向前飞行。
- 当A飞行至另外半圈的3/4位置时,A和C相遇。此时三架飞机的油量分别是:A: 0, B: 1/4, C: 3/4。C给A加1/4的油,此时三架飞机的油量分别是:A: 1/4, B: 1/4, C: 1/2。C掉头返回机场,A和B继续向前飞行。
-
- 三架飞机顺利回到机场!
- 三架飞机顺利回到机场!
两颗鸡蛋测临界楼层的问题
-
题目
- 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破。给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数。
-
分析
- 暴力法;二分;均分;非均分;
- x + (x-1) + (x-2) + ... + 1 >= 100
- x=14
- 即我先用第1个鸡蛋在以下序列表示的楼层数不断地向上测试,直到它摔破。 再用第2个鸡蛋从上一个没摔破的序列数的下一层开始,向上测试, 即可保证在最坏情况下也只需要测试14次,就能用2个鸡蛋找出从哪一层开始, 往下扔鸡蛋,鸡蛋就会摔破。
- 14, 27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100
- 代码:dp类
循环赛根据比赛局数推导第二场输家的问题
-
问题
- 甲乙丙三人,两两比赛,一人等待,获胜的人和等待的人进行比赛,输了的人下一局等待;
- 最终甲17场,乙15场,丙10场。
- 问第二局谁赢了?
-
分析
- 设ABC三人,A=17, B=15, C=10
- A=17, 因此AB+AC=17;
- B=15, 因此AB+BC=15;
- C=10, 因此AC+BC=10;
- 求和得(AB+BC+AC)=21,代入上面三个式子,可得AB, BC, AC三个值
- A=17, 因此A不在的场次由剩余的B和C两人比赛,即BC=4;
- 同理,B=15, 因此AC=6; C=10, 因此AB=11
- 综上,AB=11, 而AC+BC=10,又因为比赛规则,相同的比赛人员不能相邻,因此要在11个AB中插空插入剩余的10场比赛;
- 因此,第一场和第三场都是AB,而第二场可能是AC,也可能是BC,无法确定;
- 因此,第二场由C上场,与第一场的赢家比赛,然后输了比赛,第三场又由第二场的赢家与剩余的人比赛,即AB。
- 答:第二局最终场最少的人输了比赛,剩余两人中的某一人赢了比赛。
小老鼠喝毒药/快速核酸检测问题
-
小老鼠喝毒药问题:
- 有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?
- 如果你有两个星期的时间(换句话说你可以做两轮实验),为了从 1000 个瓶子中找出毒药,你最少需要几只老鼠?注意,在第一轮实验中死掉的老鼠,就无法继续参与第二次实验了。
-
分析:
- 此类问题,用二进制模拟十进制数,然后一次找出结果。
- 也可以用二分,但二分和二进制模拟十进制本质是一样的,比如100以内猜数字,最多7次。
- 二进制模拟更快,一步到位。
-
一次检测出的分析:
-
把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等。一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,右起第一位是 1 ;如果第二只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是 0 ……每只老鼠的死活都能确定出 10 位二进制数的其中一位,由此便可知道毒药瓶子的编号了。
-
一共有1000瓶,2的10次方是1024,刚好大于1000,也就是说,1000瓶药品可以使用10位二进制数就可以表示。从第一个开始:
-
第一瓶 : 00 0000 0001
第二瓶: 00 0000 0010
第三瓶: 00 0000 0011
……
第999瓶: 11 1111 0010
第1000瓶: 11 1111 0011
-
需要十只老鼠,如果按顺序编号,ABCDEFGHIJ分别代表从低位到高位每一个位。 每只老鼠对应一个二进制位,如果该位上的数字为1,则给老鼠喝瓶里的药。
-
观察,若死亡的老鼠编号为:ACFGJ,一共死去五只老鼠,则对应的编号为 10 0110 0101,则有毒的药品为该编号的药品,转为十进制数为:613号。
-
时间变为两周时,需要几只老鼠的分析:
- 7 只老鼠就足够了。事实上,7 只老鼠足以从 3^7 = 2187 个瓶子中找出毒药来。
- 首先,把所有瓶子从 0 到 2186 编号,然后全部转换为 7 位三进制数。现在,让第一只老鼠喝掉所有三进制数右起第一位是 2 的瓶子,让第二只老鼠喝掉所有三进制数右起第二位是 2 的瓶子,等等。一星期之后,如果第一只老鼠死了,就知道毒药瓶子的三进制编号中,右起第一位是 2 ;如果第二只老鼠没死,就知道毒药瓶子的三进制编号中,右起第二位不是 2,只可能是 0 或者 1 ……也就是说,每只死掉的老鼠都用自己的生命确定出了,三进制编号中自己负责的那一位是 2 ;但每只活着的老鼠都只能确定,它所负责的那一位不是 2 。于是,问题就归约到了只剩一个星期时的情况。在第二轮实验里,让每只活着的老鼠继续自己未完成的任务,喝掉它负责的那一位是 1 的所有瓶子。再过一星期,毒药瓶子的三进制编号便能全部揭晓了。
-
小结
- 类似地,我们可以证明, n 只小白鼠 t 周的时间可以从 (t+1)^n 个瓶子中检验出毒药来。
-
现实场景1:
- 如果一架飞机上面有100个人,下飞机后需要对每个人进行核酸和体温检测,有什么好的办法缓解这种机场的滞留呢?(我说的前置检测过程,利用乘客的自助能力,他说再打开脑洞)
-
分析:
- 从宏观讲,可以加派工作人员和检测资源,同时对机场周边的宾馆、体育馆等场地进行征用调度,设置为隔离区,将待检测人员疏散到指定隔离区。
- 体温检测可以在安检口加设一个体温检测的环节。
- 从快速得出核酸检测结果的角度讲,可以使用二分,取全部人员的样本进行一次检测,如果非阳性,可以认为没有阳性;如果有,可以将人群等分后进行检测,如果非阳性,可以排除一半,然后对剩余显示阳性的人群再次等分,分别进行核算检测,以此类推。在等分的过程中,可以加入一些人为干预分组,比如,按照有无感冒或肺炎症状进行分组,在阳性不唯一的情况下,可以更快排除非阳性人群。
- 如果要以最短时间测出,可以用二进制模拟十进制,100可以用7位模拟。
-
现实场景2:
- 飞机上下来100个旅客,最多可能一个人检测成阳性,你觉得最少用多少个试剂盒可以把这个可能是阳性的人找出来?(用二分查找)
-
分析:
- 二分或者二进制模拟十进制
- 2^7=128,因此最少用7个试剂盒可以找出这一个阳性的人。
- 7个试剂盒对应7位二进制位,每个试剂盒检测某一位为1的所有人,比如第一个试剂盒检测第一位为1的所有人,第二个试剂盒检测第二位为1的所有人,依次类推。
- 看7只老鼠哪些死了,死了的说明一定是喝了毒药的,也就是毒药瓶子的编号在相应死了的老鼠对应的位上一定是1,不然死了的老鼠是喝不上毒药的
- 比如1,3,7只试剂盒阳性,则阳性的人的编号为:2^0+ 2^2 + 2^6=69
-
现实场景3:
- 飞机上下来100个旅客,有10个人是阳性,如何把这10个人找出来?
-
分析:
- 10个人的话,超过7位,可能出现极端情况,即阳性的10个人正好导致所有试剂盒均为阳性的情况,就无法确定到底是哪些人,因此二进制模拟不可行。
- 可以用二分,同时,每次分组的过程中,按照症状、接触史等进行分组,这样可以更快将非阳性的人排除。如果分组后均阳性,可以在每组中再次分组。