從技術面試問題廣義:算法繩子燃燒
原題:有兩根繩子,每根繩子,1小時可 燒傷。但是任一條繩在不同的點上都有不同的密度,所以 不能保證繩索內部不同 部分的時間一致。
你怎麼用這兩根繩子來測量45分鐘?
我有一個一般化版本:
有n個繩,每條繩索取x分鐘至 燒傷(爲簡單起見假定x是正整數)。但繩索在不同點有不同的密度,所以 不能保證繩索內不同 部分的時間一致。
使用這些繩索,您可以測量什麼時間數量?
例如,其中n = 1和x = 60,餘可以測量60分鐘時間內 (燒繩索的一端),或30分鐘的時間內(燃燒都在同一時間結束繩索的 )
當然,我的目標是找到一個最小複雜度的算法。我想這個解決方案會涉及動態編程,但我不太確定。我的蠻力解決方案如下:
- 從第0分鐘開始,我們有n條繩索,每條繩索需要x分鐘才能燃燒。對於給定的繩索,我們可以選擇燒兩端,一端,或者根本不燒繩。在此階段,將不會被燒燬的繩索的數量設爲x,將一端被燒燬的繩索的數量設爲y,完全不燒燬的繩索的數量爲z。我們有x + y + z = n,x,y,z是正整數,z!= 0。考慮x,y和z的所有可能情況,並將這些情況添加到堆棧/隊列中。
- 對於堆棧/隊列中的每個項目,確定有繩索完成燃燒時已經過去了多少分鐘。輸出已經過去的時間(根據完成的繩索已經燃燒了多久,以及哪些末端在什麼時間點燃)計算得出。現在我們有另外一些場景,有一定數量的繩索正在被燒燬。用x + y + z = n - 1重複步驟1的參數(由於某些繩索仍在燃燒,我們無法設置火焰),並將所有新生成的案例添加到堆棧/隊列。
- 重複2.直到N = 0(所有繩索完成燃燒)
編輯: 對於n = 2並且x = 60,我發現,在下列時間週期可測:30,60 ,90,120,45和15
至於建議,我貼在cs.stackexchange.com問題:https://cs.stackexchange.com/questions/32455/algorithm-for-rope-burning-problem
http://www.braingle.com/brainteasers/teaser.php?id=673&op=2&comm=1#c – mclaassen 2014-10-29 01:35:50
偉大的問題!你能夠發佈n = 1,2,3和x = 60的樣本案例嗎?我已經發現1 = 30,60 = 2 = 30,60,90,120,15,45 3 = 30,60,90,120,15,45,150,180,7.5,22.5。在我嘗試解決問題之前,我只想確保我正確地思考這個問題。 – user2570465 2014-10-29 01:46:46
一個非常有趣的問題,但它可能屬於http://cs.stackexchange.com – 2014-10-29 02:36:48