有 n 根繩子,第 i 根繩子的長度為 l[i],現在需要 m 根等長的繩子。這道題其實就是問裁剪出 m 段等長繩子,最大裁剪長度是多少。像這樣的"找到乙個數,它要滿足一定條件"的題目,第一反應就是貪心+二分,比如 「公路建設加油站,使最小距離最大化」 這道題以及現在這道題。這道題就是找到乙個長度值 x,使得 x 滿足能夠從已有的 n 根繩子中裁剪出來 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 根。
思路明確了,**就比較好寫了,注意因為不是整數的 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 43 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 輸出輸出能切割出最長的長...