面筋分類匯總-測開向
目錄
- 數字拼湊問題
- 上山下山問題
- 稱重找不同問題
- 水桶分水問題
- 兩頭點燃計時問題
- 順序拿最后取勝問題
- 大數據量取最值問題
- 飛機加油問題
- 兩顆雞蛋測臨界樓層的問題
- 循環賽根據比賽局數推導第二場輸家的問題
- 小老鼠喝毒葯/快速核酸檢測問題
數字拼湊問題
-
題目:兩個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個人正好導致所有試劑盒均為陽性的情況,就無法確定到底是哪些人,因此二進制模擬不可行。
- 可以用二分,同時,每次分組的過程中,按照症狀、接觸史等進行分組,這樣可以更快將非陽性的人排除。如果分組后均陽性,可以在每組中再次分組。