有n
nn根繩子,第i
ii根繩子長度為l
il_i
li,現在需要m根等長的繩子,你可以對n
nn根繩子進行任意裁剪(不能拼接),請你幫忙計算出這m
mm根繩子最長的長度是多少。
輸入格式
第一行包含2個正整數n、m
n、mn、
m,表示原始繩子的數量和需求繩子的數量。
第二行包含n
nn個整數,其中第 i
ii 個整數li表示第i
ii 根繩子的長度。
輸出格式
輸出乙個數字,表示裁剪後最長的長度,保留兩位小數。
資料範圍1≤n
,m
≤100000
1≤n,m≤100000
1≤n,m≤
1000
00,0
<10
90
0<10
9輸入樣例
3 4輸出樣例3 5 4
2.50樣例解釋
第一根和第三根分別裁剪出一根2.50長度的繩子,第二根剪成2根2.50長度的繩子,剛好4根。
根據題目描述,要計算的是這m
mm根繩子最長的長度,不妨設為x
xx,其範圍應該在(0,
max]
(0, max\]
(0,max
];並且x
xx是滿足二分性質的,當繩子的長度不超過x
xx時,能裁剪的繩子數量一定大於等於m
mm;反之,一定小於m
mm。因此可以利用二分搜尋確定x
xx的值。
注意:xo(lxx的值是乙個小數,並且結果要求保留兩位小數, 因此進行二分搜尋時需要滿足r - l的精度小於0.001才能停止。
ogn)
o(logn)
o(logn
)
#include
#include
using namespace std;
const
int n =
100010
;const
double eps =
1e-3
;int a[n]
;int n, m;
//檢查當繩子長度為x時,能裁剪的繩子數量是否超過m段
bool check
(double x)
return false;
}int
main()
while
(r - l > eps)
printf
("%.2lf\n"
, l)
;return0;
}
剪繩子 演算法 C 學習之路之剪繩子問題
基於c 實現剪繩子問題,既將一根長度為n的繩子,剪成m段,使m段的乘積最大。如,長度為10的繩子,最大乘積為36。使用動態規劃和貪心演算法實現,具體 如下 include stdio.h include stdlib.h include using namespace std 動態規劃問題 剪繩子問...
劍指Offer 剪繩子 和剪繩子
劍指offer 剪繩子 題目描述 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的...
剪繩子問題
給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。首先是貪婪演算法 ...