數字遊戲;及螞蟻螞蟻分析

紫鳳發表於2013-08-14

今日面試題:數字遊戲

盒子中有n張卡片,上面的數字分別為k1,k2,...,kn。你有4次機會,每抽一次,記錄下卡片上的數字,再將卡片放回盒子中。如果4個數字的和等於m。則你就贏得遊戲,否則就是輸。直覺上,贏的可能性太低了。請你給出程式,判斷是否有贏的可能性。儘量提高方法的效率。

====================================

螞蟻螞蟻分析

原題

n只螞蟻以每秒1cm的速度在長為Lcm的竿子上爬行。螞蟻爬到終點會掉下來。兩隻螞蟻相遇時,只能調頭爬回去。對於每一隻螞蟻i,給定其距離竿子左端的距離x[i],但是我們不知道螞蟻的初始朝向。計算,所有螞蟻掉落需要的最短時間和最長時間。

分析

根據題目描述,我們不知道螞蟻的初始朝向,所以兩種都有可能。此時,我們可以先固定第0個螞蟻的方向,然後再處理其他的螞蟻。這是一個遞迴的思路,並且每個螞蟻有兩個選擇,一共2^n種情況,計算每一種情況下,所有螞蟻掉落的時間,選擇最短的、最大的則得到答案。這個題目的時間複雜度是指數級的。真真有些高了,那麼如何改進呢?

我們在摘要中說道,這個題目其實是考察大家想象力的。想象力在哪裡呢?我們首先來看看最短時間的情況,直覺上來講,所有的螞蟻都超最近的一端走,是需要最短時間的。那麼這時,會不會發生碰撞呢?顯然是不能的,A和B是兩隻不同的螞蟻。

B A

假設A到左端近,距離為LA

下面考慮最長時間的情況,也是該發揮想象力的地方。當兩隻螞蟻相遇的時候,本來是要調頭爬回去的。這與直接交錯走過去有什麼不同呢?螞蟻的速度是一樣的。大家可以舉幾個具體的例子,看看這兩種情況,差別在哪裡。例如:

B A
* 當相遇調頭時,A和B都調下來的最長時間是4秒。A向左一格,然後調頭向右三格

* 當相遇交錯走過時,A向左走三格掉落,B向右走四格掉落。則最長時間為4秒。

這並不是巧合。可以認為是同樣的情況。主要的原因就是螞蟻的速度是相同的,可以認為是獨立的。這樣,求所有螞蟻都掉落的最長時間,就是找離某一端距離最長的螞蟻,然後向著這一端走,所需要的時間。演算法的時間複雜度為O(n)。

後面求最長時間的關鍵就是,發揮想象,找到調頭和交錯走過實際上是一樣的。就搞定了。

【分析完畢】

本文來自微信:待字閨中,2013-08-13釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章