目前網路上大部分**均沒有考慮k=1時,最長長度l即為最長的木棒長度。這是因為,我們在將求解最後乙個滿足k>=k的問題轉換為求解第乙個滿足k給出n根木棒,長度均已知,現在希望通過切割它們來得到至少 k 段長度相等的木棒(長度必須是整數),問這些長度相等的木棒最長能有多長?
如果長度相等的木棒的長度l越長,那麼可以得到的木棒段數k越少 —— 單調遞減函式 k=f(l) 故用二分法!即為求解最後乙個滿足條件 k>=k 的長度l,轉換成求解第乙個滿足k#include
#include
#include
using
namespace std;
intf
(int a,
int n,
int l)
return k;
}int
solve
(int a,
int n,
int k)
else
}return left-1;
}//需要求解最後乙個滿足k>=k的長度l,即求解第乙個滿足k//但是要注意的是最後乙個k>=k可能是序列的最後乙個數,轉換成k//因此二分的邊界需要擴寬!
intmain()
;sort
(a,a+3)
;//給a按遞增排序目的是取最大的a[n-1]!
printf
("%d\n"
,solve
(a,3,7
));return0;
}
4 5木棒切割問題
木棒切割問題首先需要理解,是否可以有多個解,就來說本問題只有唯一解6,做本問題時可以考慮問題只有一解的情況 那麼可以採用計數的方法,判斷在何時取得七段相同的解,問題轉換為二分法的常規寫法。注意本題的mid是在函式的最後取中的,因為可能會遇到只要一段的 如下 include include using...
演算法筆記 木棒分割
include include include using namespace std intf int a,int mid return sum int binarysearch int a,int left,int right,int k else return left 1 int main ...
貪心演算法 木棒問題
1 問題描述 現有n根木棒,已知他們的長度和重量。要用一部木工機一根一根的加工這些木棒。該機器在加工過程中需要一定的準備時間,是用於清洗機器,調整工具和模板的。輸入 輸入有多組測試例。輸入資料的第一行是測試例的個數t。每個測試例兩行 第一行是乙個整數n 1 n 5000 表示有多少根木棒 第二行包括...