切木頭之二分法啟示

2021-09-11 14:49:14 字數 1819 閱讀 3438

183. 木材加工

有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭,需要得到的小段的數目至少為 k。當然,我們希望得到的小段越長越好,你需要計算能夠得到的小段木頭的最大長度。 木頭長度的單位是厘公尺。原木的長度都是正整數,我們要求切割得到的小段木頭的長度也要求是整數。無法切出要求至少 k 段的,則返回 0 即可。

解釋一下就是:給定了乙個切割目標長度len後,每一根原木都可以切割出多條,加在一起的數目totalcount要求大於等於k。在滿足總數目totalcount大於等於k的條件下,得到乙個最長的目標長度len。

暴力解首先想到的是暴力解,當len給定,totalcount就可以計算出來,而且可以知道len越小,totalcount就越大。那麼從最長的原木長度maxlen開始算總數,第乙個滿足totalcount>=k就是我們要的解。

時間複雜度是n*(maxlen-targetlen),隨機情況來看,每個長度概率一樣,就是n*(∑k/maxlen), 1<=k<=maxlen,即o(n*maxlen)。

這個肯定是不夠的。

動態規劃

對於最有解的問題,很自然的會想到動態規劃,而動態規劃的核心的找到大問題向小問題的轉移方式。在這一題裡,也就是找到切割目標長度len時的總數和len+1時的總數之間的關係,倘若這兩者直接的計算複雜度為o(x),那麼總複雜度為o(x*maxlen),那麼只要x有什麼辦法可以讓兩個總長度直接關聯得到計算,而不需要再次迴圈乙個個原木從新計算呢?這個我嘗試了,沒想出來。

二分法然後看了眼題目的標籤,是二分法,瞬間感覺有戲了。 這個情況裡最有用的乙個分析是:目標長度len越小,總數totalcount就越大。對比乙個二分查抄的邏輯,找到乙個目標來分隔區間,然後不斷的縮小區間,最後剩下的是解。這裡就是:一開始的選擇區間是[1,maxlen],取中數mid,求出總數,和k比較,如果總數小,那麼就要繼續壓小長度,那麼選擇區間就變成了[1,mid],反之選擇區間就是[mid,maxlen]。按照這樣的思路,區間不斷縮小,最後找到解。

int woodcut(vector&l, int k) 

maxlen = max(maxlen, len);

}//排除頭if (residue > 0)

//排除尾》=k

int maxlencount = 0;

for (int len : l)}}

//迴圈不變條件是:左邊結果》=k,右邊while (left < right-1)

if (countelse

}return left;

}複製**

啟示

這題給我最大的乙個啟示是:二分法的使用跟環境存在乙個單調遞增或遞減的關係是緊密相關的

假設存在兩個變數a和b,a和b的關係是單調遞增或遞減,假設為遞增,即a月大則b越大。然後我們要求b為b'時的a的值a',那麼就可以用二分法了。

先來乙個區間[a1, a2],只要a1和a2對應的b值是在目標的兩邊,即乙個大於目標乙個小於目標,那麼就可以用二分法的手段不斷的壓縮區間直到最後找到解。

那如果a1,a2對應的b值在同一邊呢?那麼一般這種情況下, 已經到了邊緣還沒有解,就是求最近的數,那麼解就是a1或者a2。

解演算法題,找到對應的解法模型問題就會很快,那怎麼知道某一題對應了什麼樣的解法模型,我覺得就是有一些引子、徵兆之類的東西,這才是我想說的,這個切木頭題目只是個例子。對於二分法,它的乙個徵兆就是存在兩個變數,它們之間有單調遞減或遞增的關係。

演算法之二分法

演算法 是是一種高效解決問題的辦法 需求 有乙個按照從小到大順序排列的數字列表 需要從該數字列表中找到我們想要的那個乙個數字 如何做更高效?nums 3,4,7,10,13,21,43,77,89 find num 10nums 3,4,13,10,2,7 89 nums.sort 首先進行排序 p...

c 排序之二分法

1.二分法查詢是一種非常高效的搜尋方法,主要原理是每次搜尋可以拋棄一半的值來縮小範圍。在離散數學中,如果f n 是在規模為n的搜尋序列中搜尋乙個元素所需要的比較次數,當n是偶數時,f n f n 2 2 2.二分法查詢的時間複雜度是 o logn 3.二分法查詢的適用情況一般滿足以下幾點 1 該陣列...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...