二分查詢 POJ1064 Cable Master

2021-09-29 22:47:25 字數 1684 閱讀 3723

給定n條繩子的長度a,如果從它們中切割出k條長度相同為ans的繩子,則ans最大能是多少(給定的繩子長和答案均保留兩位小數)

1<=n,k<=1e5

1<=a[i]<=1e6

問題的本質尋找可行解的上界,這與二分搜尋的思想高度契合:在有序的一組解中利用二分不斷縮小可能解的範圍,直至答案在可接受的精度內,可以尋找可行解的上界和下界

當解為浮點數時,注意模板寫法上與整數的區別

--------------++++++++

+++++++++++++±-------

--------++++++±------

+++++++±------ +++++++

左邊界l變化時,變化量應為eps而非1。

當獲取結果時,注意與整數解的區別。對於整數解來說,上界解應該為ans=r-1。但對於浮點數解,由於無法做到直接按精度取整,所以需要一些處理技巧(後面討論)

下面為浮點數二分搜尋的**模板:

//用於解有效性的判斷

bool

check

(double x)

void

solve()

printf

("%.2f"

,(floor)

(r*100)/

100)

;//保留兩位小數的寫法

}

以乙個例子來說明浮點數解上界的確定辦法。對於本題,2.00是可行解的上界,這意味著2.01就是乙個不可行解。在處理時,eps並不直接是要求得精度1e-2,而是方便地選用了1e-6。這樣,就導致了在尋找非可行解的過程中,得到的非可行解的精度更小,最後得到的非可行解的下界有可能是2.0042.006。因此,直接使用r-0.01然後捨去末尾得到的解上界是可能不對的,比如2.004-0.01=1.994 -> 1.99 。正確的做法應該是

printf

("%.2f"

,(floor)

(r*100)/

100)

;

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1e5+10;

int n,k;

double a[maxn]

;bool

check

(double x)

intmain()

*/while

(r-l>eps)

printf

("%.2f\n"

,floor

(r*100)/

100.0);

return0;

}

POJ 1064 二分搜尋

poj 1064 題目大意 有n條繩子,他們的長度分別為li,如果從他們中切割k條長度相同的繩子的話,這k條繩子每條最長能有多長?答案保留到小數點後2位 演算法分析 這個問題用二分搜尋可以非常容易的求得答案。讓我們套用二分搜尋的模型試著解決這個問題。令 條件c x 可以得到k條長度為x的繩子 則問題...

POJ1064 簡單二分

題意 有n條繩子,他們的長度分別為li。如果從他們中切割出k條長度相同的繩子的話,這k條繩子每條最長能有多長。答案保留到小數點後兩位。思路 二分搜尋的模型解決 求滿足某個條件c x 的最小 大 的x 這一問題。這個題裡 c x 可以得到k條長度為x的繩子 由於長度為li的繩子最多可以切出floor ...

poj 1064 二分答案

傳送門 problem 1064 題意 有n條繩子,長度分別為 length 1,2,3,n 如果從它們中切割出k條長度相同的繩子,這k條繩子每條最長有多長?結果保留兩位小數。題解 二分可能的長度。ac 精度問題 解範圍為 l,r 27double l 0,r maxl 1 28 for int i...