2012-07-22 75 views
1

我練習C++來解決一些練習,但經過一整天,我無法解決它們。所以,我通過網絡搜索並找到了一個簡短的解決方案,但是,我無法理解它。擠奶牛,解決方案解釋

的練習: http://jeremiahflaga.blogspot.com/2011/09/milking-cows-programming-problem-from.html

解決方案 https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=13658&lngWId=3

我很感興趣,因爲我想學習解決使用二進制數據的問題,像這樣的運動,所有的數據都存儲一個bitset裏面。

所以,很高興能有人向我解釋解決方案。

+1

也許查找「間隔調度」... – 2012-07-22 23:21:56

回答

2

所有的解決方案都是填充然後讀取一個bitset。

每秒都有一個入口位,每當有人擠牛時(在讀取for(int j = begin + 1; j <= end; j++)迴路中的輸入時設置它們)位被設置爲1。

然後,一旦讀取了所有輸入並且設置了所有適當的位,就掃描該位集以計算最長的0和1的序列(從0到1或反之亦然由if(a[i] != toggler)檢測到,其中toggler是先前的位值)。

如果你不能看到上述內容,我會建議將代碼複製到ide或編輯器中,並重新格式化它以便正確縮進。

這不是一個好的解決方案。也許這是贏得比賽的正確方式,但這不是大多數人在正常條件下寫的那種代碼,因爲它非常浪費記憶。通常對於「現實生活」中的這類問題,您將使用(開始,結束)對來管理間隔,合併重疊間隔。

+0

謝謝,現在我明白它是如何工作的,爲什麼你說這是浪費內存。我嘗試使用你推薦的方法(開始對和合並重疊對)解決問題,使用向量類。也許執行有序列表會更容易。謝謝! – 2012-07-23 00:36:05

+1

合併時間間隔相當棘手。它在概念上並不「硬」,但很容易犯錯誤,尤其是像C++這樣的語言,如果你不習慣的話。你可能在細節上有一些錯誤 - 如果你將這部分代碼分離出來,然後編寫大量測試(添加一對,檢查,添加另一個不重疊,檢查,只重複一側的重疊等等等等等等,你可能會發現錯誤並讓它工作)。 – 2012-07-23 01:01:42