潔癖朋友吃壽司卷
這是很久遠的問題了, 認識我的人應該都聽過這題的樣子. 但是這次在伯克利碰到兩個CS本科生@林習習和 @Estheroy, 給了他們這個題. 因為我常用的另一個題他們竟然聽過了.
我喜歡這種題當做面試題. 因為這題可以看人解決問題的思路.
現實模型
有兩種壽司卷, a個紅色壽司卷和b個藍色壽司卷(a和b都可以被2整除). 填滿在一個nxm的矩陣里. 所以nxm=a+b.
兩個有潔癖的人分壽司卷. 因為壽司卷放的很緊. 用筷子夾的時候要麼碰到上下兩個壽司卷(如果存在的話), 要麼會碰到左右兩個壽司卷(如果存在的話). 而另一個人是不會吃這個人碰到的壽司卷的.
設計一個演算法. 告訴這兩個人如何輪流夾壽司卷. 使得每個人都吃到a/2個紅色壽司卷b/2個藍色壽司卷.
某個解答的方法
我們假設 .
讓 為第 列的紅色壽司的個數. 假設對於任意 , . 因為我們暫時不會橫著夾任何東西, 所以可以有這樣的assumption.
我們的目標是讓兩個人取走一樣多的行.
case 1: 存在 使得 . 這樣兩個人各取一列. (這包含了n+1<m的case) 後面case假設case 1不成立.
case 2: 如果 , . 則對於任意 , . 所以我們有 .
case 3: 如果 , , . 則對於任意 , . .
case 4: 如果 , , . 則矩陣里每行都有一個藍色的壽司卷. 我們可以紅色藍色對調並且旋轉一下矩陣獲得case 3.
case 5. n和m之間必須有一個是偶數. 現在只剩下要考慮 為下列三種情況 . 利用a,b都是偶數這個屬性. 可以搞定最後的幾個可能.
如果足夠careful可以利用這個寫出一個O(nm)的演算法... 有點麻煩就是了...
更多問題:
- 如果矩陣沒有被擺滿呢?
- 如果第一個人想吃到k個紅壽司卷, l個藍壽司卷, 第二個人要吃a-k個紅壽司卷, b-l個藍壽司卷呢? 這時對a,b的偶數要求也沒有了.
- 壽司卷擺在一個nxmxr的cube里, 有兩個有潔癖的四維生物用二維的筷子呢?
題圖是遊戲 Asamis Sushi Shop.
推薦閱讀:
※如何支持動態加滿足某種條件不定個數邊,在線判斷是否是二分圖(見問題描述)?
※是否存在某種成熟的方法用較少的字元表示大量的信息?
※求各位大俠推薦一些有關於概率地圖(機器人路徑規劃)方面的書籍,目前只能找到相關文獻,求推薦!?
※關於計算機的一切,有可稱靈性的東西嗎?
※B樹 是怎麼存到硬碟上的?