C 題解 剪繩子

2021-10-17 15:22:43 字數 1604 閱讀 6644

有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的值。

注意:x

xx的值是乙個小數,並且結果要求保留兩位小數, 因此進行二分搜尋時需要滿足r - l的精度小於0.001才能停止。

o(l

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。首先是貪婪演算法 ...