有趣的智力題


偶然在訂閱號中看到一些校招的智力題,覺得有點意思,於是花了些時間收集一些,網上搜了下,在此mark下~~

  1. 有20瓶葯丸,其中19瓶裝有1克/粒的葯丸,余下一瓶裝有1.1克/粒的葯丸。給你一台稱重精准的天平,怎么找出比較重的那瓶葯丸?天平只能用一次。

解法:有時候,嚴格的限制條件有可能反倒是解題的線索。在這個問題中,限制條件是天平只能用一次。因為天平只能用一次,我們也得以知道一個有趣的事實:一次必須同時稱很多葯丸,其實更准確地說,是必須從19瓶拿出葯丸進行稱重。否則,如果跳過兩瓶或更多瓶葯丸,又該如何區分沒稱過的那幾瓶呢?別忘了,天平只能用一次。

那么,該怎么稱重取自多個葯瓶的葯丸,並確定哪一瓶裝有比較重的葯丸?假設只有兩瓶葯丸,其中一瓶的葯丸比較重。每瓶取出一粒葯丸,稱得重量為2.1克,但無從知道這多出來的0.1克來自哪一瓶。我們必須設法區分這些葯瓶。

如果從葯瓶#1取出一粒葯丸,從葯瓶#2取出兩粒葯丸,那么,稱得重量為多少呢?結果要看情況而定。如果葯瓶#1的葯丸較重,則稱得重量為3.1克。如果葯瓶#2的葯丸較重,則稱得重量為3.2克。這就是這個問題的解題竅門。

稱一堆葯丸時,我們會有個“預期”重量。而借由預期重量和實測重量之間的差別,就能得出哪一瓶葯丸比較重,前提是從每個葯瓶取出不同數量的葯丸。

將之前兩瓶葯丸的解法加以推廣,就能得到完整解法:從葯瓶#1取出一粒葯丸,從葯瓶#2取出兩粒,從葯瓶#3取出三粒,依此類推。如果每粒葯丸均重1克,則稱得總重量為210克(1 + 2 + … + 20 = 20 * 21 / 2 = 210),“多出來的”重量必定來自每粒多0.1克的葯丸。葯瓶的編號可由算式(weight – 210 grams) / 0.1 grams得出。因此,若這堆葯丸稱得重量為211.3克,則葯瓶#13裝有較重的葯丸。

2.有個8×8棋盤,其中對角的角落上,兩個方格被切掉了。給定31塊多米諾骨牌,一塊骨牌恰好可以覆蓋兩個方格。用這31塊骨牌能否蓋住整個棋盤?請證明你的答案(提供范例,或證明為什么不可能)。

解法:乍一看,似乎是可以蓋住的。棋盤大小為8×8,共有64個方格,但其中兩個方格已被切掉,因此只剩62個方格。31塊骨牌應該剛好能蓋住整個棋盤,對吧?
嘗試用骨牌蓋住第1行,而第1行只有7個方格,因此有一塊骨牌必須鋪至第2行。而用骨牌蓋住第2行時,我們又必須將一塊骨牌鋪至第3行。要蓋住每一行,總有一塊骨牌必須鋪至下一行。無論嘗試多少次、多少種方法,我們都無法成功鋪下所有骨牌。
其實,還有更簡潔更嚴謹的證明說明為什么不可能。棋盤原本有32個黑格和32個白格。將對角角落上的兩個方格(相同顏色)切掉,棋盤只剩下30個同色的方格和32個另一種顏色的方格。為方便論證起見,我們假定棋盤上剩下30個黑格和32個白格。放在棋盤上的每塊骨牌必定會蓋住一個白格和一個黑格。因此,31塊骨牌正好蓋住31個白格和31個黑格。然而,這個棋盤只有30個黑格和32個白格,所以,31塊骨牌蓋不住整個棋盤。

3.有兩個水壺,容量分別為5誇脫(美制:1誇脫=0.946升,英制:1誇脫=1.136升)和3誇脫,若水的供應不限量(但沒有量杯),怎么用這兩個水壺得到剛好4誇脫的水?注意,這兩個水壺呈不規則形狀,無法精准地裝滿“半壺”水。

解法

根據題意,我們只能使用這兩個水壺,不妨隨意把玩一番,把水倒來倒去,可以得到如下順序組合:
注意,許多智力題其實都隱含數學或計算機科學的背景,這個問題也不例外。只要這兩個水壺的容量互質(即兩個數沒有共同的質因子),我們就能找出一種倒水的順序組合,量出1到2個水壺容量總和(含)之間的任意水量。

4.有個島上住着一群人,有一天來了個游客,定了一條奇怪的規矩:所有藍眼睛的人都必須盡快離開這個島。每晚8點會有一個航班離島。每個人都看得見別人眼睛的顏色,但不知道自己的(別人也不可以告知)。此外,他們不知道島上到底有多少人是藍眼睛的,只知道至少有一個人的眼睛是藍色的。所有藍眼睛的人要花幾天才能離開這個島?

解法:下面將采用簡單構造法。假定這個島上一共有n人,其中c人有藍眼睛。由題目可知,c > 0。

  1. 情況c = 1:只有一人是藍眼睛的

假設島上所有人都是聰明的,藍眼睛的人四處觀察之后,發現沒有人是藍眼睛的。但他知道至少有一人是藍眼睛的,於是就能推導出自己一定是藍眼睛的。因此,他會搭乘當晚的飛機離開。

2.情況c = 2:只有兩人是藍眼睛的

兩個藍眼睛的人看到對方,並不確定c是1還是2,但是由上一種情況,他們知道,如果c = 1,那個藍眼睛的人第一晚就會離島。因此,發現另一個藍眼睛的人仍在島上,他一定能推斷出c = 2,也就意味着他自己也是藍眼睛的。於是,兩個藍眼睛的人都會在第二晚離島。

3.情況c > 2:一般情況

逐步提高c時,我們可以看出上述邏輯仍舊適用。如果c = 3,那么,這三個人會立即意識到有2到3人是藍眼睛的。如果有兩人是藍眼睛的,那么這兩人會在第二晚離島。因此,如果過了第二晚另外兩人還在島上,每個藍眼睛的人都能推斷出c = 3,因此這三人都有藍眼睛。他們會在第三晚離島。

不論c為什么值,都可以套用這個模式。所以,如果有c人是藍眼睛的,則所有藍眼睛的人要用c晚才能離島,且都在同一晚離開。

5.有棟建築物高100層。若從第N層或更高的樓層扔下來,雞蛋就會破掉。若從第N層以下的樓層扔下來則不會破掉。給你2個雞蛋,請找出N,並要求最差情況下扔雞蛋的次數為最少。

解法:我們發現,無論怎么扔雞蛋1(Egg 1),雞蛋2(Egg 2)都必須在“破掉那一層”和下一個不會破掉的最高樓層之間,逐層扔下樓(從最低的到最高的)。例如,若雞蛋1從5層和10層樓扔下沒破掉,但從15層扔下時破掉了,那么,在最差情況下,雞蛋2必須嘗試從11、12、13和14層扔下樓。

具體做法:

首先,讓我們試着從10層開始扔雞蛋,然后是20層,等等。

 如果雞蛋1第一次扔下樓(10層)就破掉了,那么,最多需要扔10次。

 如果雞蛋1最后一次扔下樓(100層)才破掉,那么,最多要扔19次(10、20、…、90、100層,然后是91到99層)。

這么做也挺不錯,但我們只考慮了絕對最差情況。我們應該進行“負載均衡”,讓這兩種情況下扔雞蛋的次數更均勻。

我們的目標是設計一種扔雞蛋的方法,使得扔雞蛋1時,不論是在第一次還是最后一次扔下樓才破掉,次數越穩定越好。

(1) 完美負載均衡的方法應該是,扔雞蛋1的次數加上扔雞蛋2的次數,不論什么時候都一樣,不管雞蛋1是從哪層樓扔下時破掉的。

(2) 若有這種扔法,每次雞蛋1多扔一次,雞蛋2就可以少扔一次。

(3) 因此,每丟一次雞蛋1,就應該減少雞蛋2可能需要扔下樓的次數。例如,如果雞蛋1先從20層往下扔,然后從30層扔下樓,此時雞蛋2可能就要扔9次。若雞蛋1再扔一次,我們必須讓雞蛋2扔下樓的次數降為8次。也就是說,我們必須讓雞蛋1從39層扔下樓。

(4) 由此可知,雞蛋1必須從X層開始往下扔,然后再往上增加X1層……直至到達100層。

(5) 求解方程式X + (X1) + (X2) + … + 1 = 100,得到X (X + 1) / 2 = 100 → X = 14。

我們先從14層開始,然后是27層,接着是39層,依此類推,最差情況下雞蛋要扔14次。

正如解決其他許多最大化/最小化的問題一樣,這類問題的關鍵在於“平衡最差情況”。

6.走廊上有100個關上的儲物櫃。有個人先是將100個櫃子全都打開。接着,每數兩個櫃子關上一個。然后,在第三輪時,再每隔兩個就切換第三個櫃子的開關狀態(也就是將關上的櫃子打開,將打開的關上)。照此規律反復操作100次,在第i輪,這個人會每數i個就切換第i個櫃子的狀態。當第100輪經過走廊時,只切換第100個櫃子的開關狀態,此時有幾個櫃子是開着的?

解法:要解決這個問題,我們必須弄清楚所謂切換儲物櫃開關狀態是什么意思。這有助於我們推斷最終哪些櫃子是開着的。

  1. 問題:櫃子會在哪幾輪切換狀態(開或關)?

櫃子n會在n的每個因子(包括1和n本身)對應的那一輪切換狀態。也就是說,櫃子15會在第1、3、5和15輪開或關一次。

  1. 問題:櫃子什么時候還是開着的?

如果因子個數(記作x)為奇數,則這個櫃子是開着的。你可以把一對因子比作開和關,若還剩一個因子,則櫃子就是開着的。

  1. 問題:x什么時候為奇數?

若n為完全平方數,則x的值為奇數。理由如下:將n的兩個互補因子配對。例如,如n為36,則因子配對情況為:(1, 36)、(2, 18)、(3, 12)、(4, 9)、(6, 6)。注意,(6, 6)其實只有一個因子,因此n的因子個數為奇數。

  1. 問題:有多少個完全平方數?

一共有10個完全平方數,你可以數一數(1、4、9、16、25、36、49、64、81、100),或者,直接列出1到10的平方:
1 * 1, 2 * 2, 3 * 3, …, 10*10

因此,最后共有10個櫃子是開着的。

7.考慮一個雙人游戲。游戲在一個圓桌上進行。每個游戲者都有足夠多的硬幣。他們需要在桌子上輪流放置硬幣,每次必需且只能放置一枚硬幣,要求硬幣完全置於桌面內(不能有一部分懸在桌子外面),並且不能與原來放過的硬幣重疊。誰沒有地方放置新的硬幣,誰就輸了。游戲的先行者還是后行者有必勝策略?這種策略是什么?

答案:先行者在桌子中心放置一枚硬幣,以后的硬幣總是放在與后行者剛才放的地方相對稱的位置。這樣,只要后行者能放,先行者一定也有地方放。先行者必勝。

8.用線性時間和常數附加空間將一篇文章的單詞(不是字符)倒序。

答案:先將整篇文章的所有字符逆序(從兩頭起不斷交換位置相對稱的字符);然后用同樣的辦法將每個單詞內部的字符逆序。這樣,整篇文章的單詞順序顛倒了,但單詞本身又被轉回來了。

9.用線性時間和常數附加空間將一個長度為n的字符串向左循環移動m位(例如,”abcdefg”移動3位就了”defgabc”)。

答案:把字符串切成長為m和n-m的兩半。將這兩個部分分別逆序,再對整個字符串逆序。

10.** 一個矩形蛋糕,蛋糕內部有一塊矩形的空洞。只用一刀,如何將蛋糕切成大小相等的兩塊?**

答案:注意到平分矩形面積的線都經過矩形的中心。過大矩形和空心矩形各自的中心畫一條線,這條線顯然把兩個矩形都分成了一半,它們的差當然也是相等的。

11.一塊矩形的巧克力,初始時由N x M個小塊組成。每一次你只能把一塊巧克力掰成兩個小矩形。最少需要幾次才能把它們掰成N x M塊1×1的小巧克力?

答案:N x M – 1次顯然足夠了。這個數目也是必需的,因為每掰一次后當前巧克力的塊數只能增加一,把巧克力分成N x M塊當然需要至少掰N x M – 1次。

12.如何快速找出一個32位整數的二進制表達里有多少個”1″?用關於”1″的個數的線性時間?

答案1(關於數字位數線性):for(n=0; b; b >>= 1) if (b & 1) n++;
答案2(關於”1″的個數線性):for(n=0; b; n++) b &= b-1;

13.** 一個大小為N的數組,所有數都是不超過N-1的正整數。用O(N)的時間找出重復的那個數(假設只有一個)。一個大小為N的數組,所有數都是不超過N+1的正整數。用O(N)的時間找出沒有出現過的那個數(假設只有一個)。**

答案:計算數組中的所有數的和,再計算出從1到N-1的所有數的和,兩者之差即為重復的那個數。計算數組中的所有數的和,再計算出從1到N+1的所有數的和,兩者之差即為缺少的那個數。

14.給出一行C語言表達式,判斷給定的整數是否是一個2的冪。

答案:(b & (b-1)) == 0

15.地球上有多少個點,使得從該點出發向南走一英里,向東走一英里,再向北走一英里之后恰好回到了起點?

答案:“北極點”是一個傳統的答案,其實這個問題還有其它的答案。事實上,滿足要求的點有無窮多個。所有距離南極點1 + 1/(2π)英里的地方都是滿足要求的,向南走一英里后到達距離南極點1/(2π)的地方,向東走一英里后正好繞行緯度圈一周,再向北走原路返回到起點。事實上,這仍然不是滿足要求的全部點。距離南極點1 + 1/(2kπ)的地方都是可以的,其中k可以是任意一個正整數。

16.A、B兩人分別在兩座島上。B生病了,A有B所需要的葯。C有一艘小船和一個可以上鎖的箱子。C願意在A和B之間運東西,但東西只能放在箱子里。只要箱子沒被上鎖,C都會偷走箱子里的東西,不管箱子里有什么。如果A和B各自有一把鎖和只能開自己那把鎖的鑰匙,A應該如何把東西安全遞交給B?

答案:A把葯放進箱子,用自己的鎖把箱子鎖上。B拿到箱子后,再在箱子上加一把自己的鎖。箱子運回A后,A取下自己的鎖。箱子再運到B手中時,B取下自己的鎖,獲得葯物。

17.一對夫婦邀請N-1對夫婦參加聚會(因此聚會上總共有2N人)。每個人都和所有自己不認識的人握了一次手。然后,男主人問其余所有人(共2N-1個人)各自都握了幾次手,得到的答案全部都不一樣。假設每個人都認識自己的配偶,那么女主人握了幾次手?

答案:握手次數只可能是從0到2N-2這2N-1個數。除去男主人外,一共有2N-1個人,因此每個數恰好出現了一次。其中有一個人(0)沒有握手,有一個人(2N-2)和所有其它的夫婦都握了手。這兩個人肯定是一對夫妻,否則后者將和前者握手(從而前者的握手次數不再是0)。除去這對夫妻外,有一個人(1)只與(2N-2)握過手,有一個人(2N-3)和除了(0)以外的其它夫婦都握了手。這兩個人肯定是一對夫妻,否則后者將和前者握手(從而前者的握手次數不再是1)。以此類推,直到握過N-2次手的人和握過N次手的人配成一對。此時,除了男主人及其配偶以外,其余所有人都已經配對。根據排除法,最后剩下來的那個握手次數為N-1的人就是女主人了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM