給一個瞎子52張撲克牌,並告訴他裏面剛好有10張牌是正面朝上的。要求這個瞎子把牌分紅兩堆,使得每堆牌里正面朝上的牌的張數同樣多。瞎子應該怎麼作?遞歸
答案:把撲克牌分紅兩堆,一堆10張,一堆42張。而後,把小的那一堆裏的全部牌所有翻過來。數學
如何用一枚硬幣等機率地產生一個1到3之間的隨機整數?若是這枚硬幣是不公正的呢?並行
答案:若是是公正的硬幣,則投擲兩次,「正反」爲1,「反正」爲2,「正正」爲3,「反反」重來。方法
若是是不公正的硬幣,注意到出現「正反」和「反正」的機率同樣,所以令「正反反正」、「反正正反」、「正反正反」分別爲一、二、3,其他狀況重來。另外一種更妙的辦法是,投擲三次硬幣,「正反反」爲1,「反正反」爲2,「反反正」爲3,其他狀況重來。集合
30枚面值不全相同的硬幣擺成一排,甲、乙兩我的輪流選擇這排硬幣的其中一端,並取走最外邊的那枚硬幣。若是你先取硬幣,能保證獲得的錢不會比對手少嗎?數字
答案:先取者可讓本身老是取奇數位置上的硬幣或者老是取偶數位置上的硬幣。數一數是奇數位置上的面值總和多仍是偶數位置上的面值總和多,而後老是取這些位置上的硬幣就能夠了。生成
一個環形軌道上有n個加油站,全部加油站的油量總和正好夠車跑一圈。證實,總能找到其中一個加油站,使得初始時油箱爲空的汽車從這裏出發,可以順利環行一圈回到起點。顏色
答案:總存在一個加油站,僅用它的油就足夠跑到下一個加油站(不然全部加油站的油量加起來將不夠全程)。把下一個加油站的全部油都提早搬到這個加 油站來,並把油已被搬走的加油站無視掉。在剩下的加油站中繼續尋找油量足以到達下個加油站的地方,不斷合併加油站,直到只剩一個加油站爲止。顯然從這裏出 發就能順利跑徹底程。
另外一種證實方法:先讓汽車油箱裏裝好足夠多的油,隨便從哪一個加油站出發試跑一圈。車每到一個加油站時,記錄此時油箱裏剩下的油量,而後把那個加油站的油所有裝上。試跑完一圈後,檢查剛纔路上到哪一個加油站時剩的油量最少,那麼空着油箱從那裏出發顯然必定能跑徹底程。
初始時,兩個口袋裏各有一個球。把後面的n-2個球依次放入口袋,放進哪一個口袋其機率與各口袋已有的球數成正比。這樣下來,球數較少的那個口袋平均指望有多少個球?
答案:先考慮一個看似無關的問題——怎樣產生一個1到n的隨機排列。首先,在紙上寫下數字1;而後,把2寫在1的左邊或者右邊;而後,把3寫在最 左邊,最右邊,或者插進1和2之間……總之,把數字i等機率地放進由前面i-1個數產生的(包括最左端和最右端在內的)共i個空位中的一個。這樣生成的顯 然是一個徹底隨機的排列。
咱們換一個角度來看題目描述的過程:假想用一根繩子把兩個球拴在一塊兒,把這根繩子標號爲1。接下來,把其中一個小球分裂成兩個小球,這兩個小球用 標號爲2的繩子相連。總之,把「放進第i個球」的操做想象成把其中一個球分裂成兩個用標有i-1的繩子相連的小球。聯想咱們前面的討論,這些繩子的標號事 實上是一個隨機的全排列,也就是說最開始繩子1的位置最後等可能地出如今每一個地方。也就是說,它兩邊的小球個數(1,n-1)、(2,n-2)、 (3,n-3)、……、(n-1,1)這n-1種狀況等可能地發生。所以,小袋子裏的球數大約爲n/4個。準確地說,當n爲奇數時,小袋子裏的球數爲 (n+1)/4;當n爲偶數時,小袋子裏的球數爲n^2/(4n-4)。
考慮一個n*n的棋盤,把有公共邊的兩個格子叫作相鄰的格子。初始時,有些格子裏有病毒。每一秒鐘後,只要一個格子至少有兩個相鄰格子染上了病毒,那麼他本身也會被感染。爲了讓全部的格子都被感染,初始時最少須要有幾個帶病毒的格子?給出一種方案並證實最優性。
答案:至少要n個,好比一條對角線上的n個格子。n個格子也是必需的。當一個新的格子被感染後,全體被感染的格子所組成的圖形的周長將減小0個、 2個或4個單位(具體減小了多少要看它周圍被感染的格子有多少個)。又由於當全部格子都被感染後,圖形的周長爲4n,所以初始時至少要有n個被感染的格 子。
在一個m*n的棋盤上,有k個格子裏放有棋子。是否總能對全部棋子進行紅藍二染色,使得每行每列的紅色棋子和藍色棋子最多差一個?
答案:能夠。建一個二分圖G(X,Y),其中X有m個頂點表明了棋盤的m個行,Y有n個頂點表明了棋盤的n個列。第i行第j列有棋子就在X(i) 和Y(j)之間連一條邊。先找出圖G裏的全部環(因爲是二分圖,環的長度必定是偶數),把環裏的邊紅藍交替染色。剩下的沒染色的圖必定是一些樹。對每棵樹 遞歸地進行操做:去掉一個葉子節點和對應邊,把剩下的樹進行合法的紅藍二染色,再把剛纔去掉的頂點和邊加回去,給這個邊適當的顏色以知足要求。
任意給一個88的01矩陣,你每次只能選一個33或者4*4的子矩陣並把裏面的元素所有取反。是否總有辦法把矩陣裏的全部數所有變爲1?
答案:不能。大矩陣中有36個33的小矩陣和25個44的小矩陣,所以總共有61種可能的操做。顯然,給定一個操做序列,這些操做的前後順序 是可有可無的;另外,在一個操做序列中使用兩種或兩種以上相同的操做也是無用的。所以,實質不一樣的操做序列只有2^61種。但8*8的01矩陣一共有 2^64種,所以不是每種狀況都有辦法達到目的。
五個洞排成一排,其中一個洞裏藏有一隻狐狸。每一個夜晚,狐狸都會跳到一個相鄰的洞裏;每一個白天,你都只容許檢查其中一個洞。怎樣才能保證狐狸最終會被抓住?
答案:按照2, 3, 4, 2, 3, 4的順序檢查狐狸洞能夠保證抓住狐狸。爲了說明這個方案是可行的,用集合F表示狐狸可能出現的位置,初始時F = {1, 2, 3, 4, 5}。若是它不在2號洞,則次日狐狸已經跑到了F = {2, 3, 4, 5}。若是此時它不在3號洞,則第三天狐狸必定跑到了F = {1, 3, 4, 5}。若是此時它不在4號洞,則再過一晚後F = {2, 4}。若是此時它不在2號洞,則再過一天F = {3, 5}。若是此時它不在3號洞,再過一天它就必定跑到4號洞了。
方案不是惟一的,下面這些方案都是可行的:
2, 3, 4, 4, 3, 2
4, 3, 2, 2, 3, 4
4, 3, 2, 4, 3, 2
一個經典老題是說,把一個333的立方體切成27個單位立方體,若每一刀切完後都容許從新擺放各個小塊的位置,最少能夠用幾刀?答案仍然是6刀,由於 正中間那個單位立方體的6個面都是後來才切出來的,所以怎麼也須要6刀。考慮這個問題:若把一個nnn的立方體切成一個個單位立方體,最少須要幾刀?
答案:事實上,從一個更強的命題出發反而能使問題變得更簡單。對於一個abc的長方體,咱們須要f(a)+f(b)+f(c)刀,其中 f(x)=⌈log(x)/log(2)⌉。只須要注意到,在整個過程當中的任何一步,切完當前最大的塊所須要的刀數也就等於整個過程還須要的刀數,由於其 它小塊須要的刀數都不會超過最大塊所需刀數,它們均可以與最大塊一道並行處理。這代表,咱們的最優決策便是讓當前的最大塊儘量的小,也就是說要把當前的 最大塊儘量相等地切成兩半。利用數學概括法,咱們能夠很快獲得本段開頭的結論。