今天在論壇看到一題目 國王和100個囚犯
大概在去年,朋友問過過我這個問題。
方案比較簡單:
首先,第一天出來的人,擔當「計數者」,它把燈開起來(原來開著就不必動了)
然後每天出來乙個囚犯。
如果他不是「計數者」,並且沒有關過燈, 並且燈開著, 那麼就把燈關了。
如果他是「計數者」, 如果燈關了, 就把他開起來(計數+1)。 當然如果燈被關了99次, 那麼就去和國王說吧。
但顯然也是乙個概論問題, 因為每次出來的囚犯隨機,
現在問題是,如果採用這個方案, 大概他們多久可以出來?
先不忙著用數學進行計算, 我們用程式統計平均天數:
首先, 進行一次實驗的天數是這樣的:
public static int escapedays()
if (!light)
} else
}}
return days;
}
然後我們讓實驗進行一萬次。
public static void main(string args)
system.out.println("平均需要的天數:" + days / times);
}
在我的電腦上輸出:
平均需要的天數:10428
差不多是 28 ~ 29 年時間。超過無期徒刑了, 國王還真會玩, 要是被囚犯們知道, 直接撞牆自殺了。
讓我們再用數學去計算一下:
首先,第一天出來的是「計數者」, 這是乙個必然事件, 沒啥好說的。
從第二天開始, 我們要完成以下過程 99 次
出來乙個新的囚犯, 然後等待「計數者」出來把燈開起來。
第一次出來新的囚犯的概率是: 99 / 100 --- 除去計數者, 其他任何囚犯出來都滿足要求
完成這一步的平均時間是 100 / 99 天
完成上面這個過程後,接著要求「計數者」出來,開燈。 這個概率是 1 / 100
完成這一步的平均時間是 100 天
第二次, 新囚犯出來的概率是 98 / 100
完成這一步的平均時間是 100 / 98
計數者出來的率還是 1 / 100
完成這一步的平均時間還是 100 天
第99次, 新囚犯出來的概率是 1 / 100 (只有乙個囚犯沒有出來了)
計數者出來的率還是 1 / 100
然後我們把時間加起來:
100 / 99 + 100 + 100 / 98 + 100 + ... 100 / 1 + 100
= 100 * 99 + 100 * (1 / 99 + 1 / 98 + 1 / 97 + ... + 1)
= 9900 + 100 * (1 + 1 / 2 + 1 / 3 + ... 1 / 99)
呼呼, 上面 1 + 1 / 2 + 1 / 3 + ... 1 / 99 這是乙個調和級數 大概等於 ln 99 + 1 ,
當然可以用程式 很容易求得 值為: 5.177
所以上述值為: 10417
和上面程式測試10000次的值吻合!
趣味演算法 國王和100個囚犯(據說是騰訊的面試題)
國王招來100個囚犯,對他們說 你們犯的是死罪,但我給你們一次求生的機會。15分鐘以後,你們將被關進乙個有100間隔離牢房的監獄裡,每人一間牢房,都與外界隔絕,什麼也聽不見看不到,連時間都沒法計算,無法獲得外界的任何資訊。這所監獄有乙個院子,每天只少隨機 注意是完全隨機 開啟一間牢房的門,讓乙個囚犯...
每天一道演算法題 國王和囚犯
上一題真心優化不出了的說。tat。話說還是最喜歡今天這樣的趣味智力題,雖然和演算法也沒什麼大關係噠,很適合消磨時間就是了 題目來了 國王招來100個囚犯,對他們說 你們犯的是死罪,但我給你們一次求生的機會。15分鐘以後,你們將被關進乙個有100間隔離牢房的監獄裡,每人一間牢房,都與外界隔絕,什麼也聽...
關於五個囚犯的智力題
題目 5個囚犯,分別按1 5號在裝有100顆綠豆的麻袋抓綠豆,規定每人至少抓一顆,而抓得最多和最少的人將被處死,而且,他們之間不能交流,但在抓的時候,可以摸出剩下的豆子數。問他們中誰的存活機率最大?1,他們都是很聰明的人 2,他們的原則是先求保命,再去多殺人 3,100顆不必都分完 4,若有重複的情...