二分 貪心 用 N 根繩子裁剪出 M 根等長繩子

2021-09-26 15:23:56 字數 2466 閱讀 9589

有 n 根繩子,第 i 根繩子的長度為 l[i],現在需要 m 根等長的繩子。

你可以對這 n 根繩子進行任意裁剪(不能拼接),請你計算出這 m 根繩子最長的長度。

輸入描述:

第一行包括兩個整數 n, m,含義如題所述(1 <= n, m <= 100000)

第二行包含n個整數,分別對應n根繩子的長度(0 < l[i] < 109)

輸出描述:

乙個數字,表示裁剪後最長的長度,保留兩位小數

示例輸入:

3 43 5 4

示例輸出:2.50

解釋: 第一根和第三根繩子分別裁剪出一根 2.50 長的繩子,第二根繩子剛好可以裁剪出兩根 2.50 的長繩子,共 4 根。

這道題其實就是問裁剪出 m 段等長繩子,最大裁剪長度是多少。像這樣的"找到乙個數,它要滿足一定條件"的題目,第一反應就是貪心+二分,比如 「公路建設加油站,使最小距離最大化」 這道題以及現在這道題。這道題就是找到乙個長度值 x,使得 x 滿足能夠從已有的 n 根繩子中裁剪出來 m 段

思路明確了,**就比較好寫了,注意因為不是整數的 l 和 r,所以判斷條件從 r

>=l

r >= l

r>=l

變成 r−l

>ep

sr - l > eps

r−l>ep

s,eps是乙個自己設的數,比如 1e-6:

#include

#include

using

namespace std;

bool

check_len

(double len,

const vector<

int>

& ropes,

int target)

return

false;}

intmain()

double l =

0, r = total_len;

while

(r - l >

1e-6

)printf

("%.2f\n"

, r)

;return0;

}

執行結果如下:

3 4

3 5 4

l = 0.000000, r = 12.000000, mid = 6.000000

l = 0.000000, r = 6.000000, mid = 3.000000

l = 0.000000, r = 3.000000, mid = 1.500000

l = 1.500000, r = 3.000000, mid = 2.250000

l = 2.250000, r = 3.000000, mid = 2.625000

l = 2.250000, r = 2.625000, mid = 2.437500

l = 2.437500, r = 2.625000, mid = 2.531250

l = 2.437500, r = 2.531250, mid = 2.484375

l = 2.484375, r = 2.531250, mid = 2.507813

l = 2.484375, r = 2.507813, mid = 2.496094

l = 2.496094, r = 2.507813, mid = 2.501953

l = 2.496094, r = 2.501953, mid = 2.499023

l = 2.499023, r = 2.501953, mid = 2.500488

l = 2.499023, r = 2.500488, mid = 2.499756

l = 2.499756, r = 2.500488, mid = 2.500122

l = 2.499756, r = 2.500122, mid = 2.499939

l = 2.499939, r = 2.500122, mid = 2.500031

l = 2.499939, r = 2.500031, mid = 2.499985

l = 2.499985, r = 2.500031, mid = 2.500008

l = 2.499985, r = 2.500008, mid = 2.499996

l = 2.499996, r = 2.500008, mid = 2.500002

l = 2.499996, r = 2.500002, mid = 2.499999

l = 2.499999, r = 2.500002, mid = 2.500000

l = 2.499999, r = 2.500000, mid = 2.500000

2.50

分割繩子(二分)

時間限制 1 sec 記憶體限制 128 mb 題目描述 現有n條繩子,它們的長度分別為l1,l2,ln,如果從它們中切割出k條長度相同的繩子,這k條繩子每條最長能有多長?輸入共有兩行,第一行包含兩個正整數n和k,用乙個空格分隔 第二行包含n個數,依次表示n條繩子的長度,兩數間用乙個空格分隔。每條繩...

分割繩子(二分)

現在有n 1 n 1000 條繩子,他們的長度分別為l1,l2,ln 1 li 10000 如果從他們中切割出k 1 k 1000 條長度相同的繩子,這k條繩子每條最長能多長?收起共有兩行,第一行包含兩個正整數n和k,用乙個空格分割 第二行包含n個數,一次表示n條繩子的長度,兩數間用乙個空格分隔,每...

繩子切割 二分查詢

題目描述 有n條繩子,它們的長度為li li 1000 如果從它們中切割出k條長度相同的繩子的話,這條繩子每條最長能有多長?答案保留到小數點後2位。輸入輸入包含兩行,第一行有兩個整數n和k,n代表n條繩子,k代表切割出的長度。4 11 8 02 7.43 4.57 5.39 輸出輸出能切割出最長的長...