題目出處:《資訊需奧賽一本通》第七章練習7(northeastern europe 2001)
題目描述
仙境的居民們決定舉辦一場程式設計區域賽。裁判委員會完全由自願組成,他們承諾要組織一次史上最公正的比賽。他們決定將選手的電腦用星形拓撲結構連線在一起,即將它們全部連到乙個單一的中心伺服器。為了組織這個完全公正的比賽,裁判委員會主席提出要將所有選手的電腦等距離地圍繞在伺服器周圍放置。
為購買網線,裁判委員會聯絡了當地的乙個網路解決方案提供商,要求能夠提供一定數量的等長網線。裁判委員會希望網線越長越好,這樣選手們之間的距離可以盡可能遠一些。
該公司的網線主管承接了這個任務。他知道庫存中每條網線的長度(精確到厘公尺),並且只要告訴他所需的網線長度(精確到厘公尺),他都能夠完成對網線的切割工作。但是,這次,所需的網線長度並不知道,這讓網線主管不知所措。
你需要編寫乙個程式,幫助網線主管確定乙個最長的網線長度,並且按此長度對庫存中的網線進行切割,能夠得到指定數量的網線。
輸入格式
第一行包含兩個整數n和k,以單個空格隔開。n(1 <= n <= 10000)是庫存中的網線數,k(1 <= k <= 10000)是需要的網線數量。
接下來n行,每行乙個數,為庫存中每條網線的長度(單位:公尺)。所有網線的長度至少1m,至多100km。輸入中的所有長度都精確到厘公尺,即保留到小數點後兩位。
輸出格式
網線主管能夠從庫存的網線中切出指定數量的網線的最長長度(單位:公尺)。必須精確到厘公尺,即保留到小數點後兩位。
若無法得到長度至少為1cm的指定數量的網線,則必須輸出「0.00」(不包含引號)。
樣例輸入
4 11
8.02
7.43
4.57
5.39
樣例輸出2.00
題目分析
這道題目其實和《最大值最小化》具有相同的解法,幾乎是一模一樣的題。同樣也是二分答案,但是這道題是在實數範圍內進行二分。
整數的二分
對於整數的二分,我們二分實現的偽**是:
int l = 左邊界, r = 右邊界, res = -1;
while (l <= r)
else
}
而迴圈結束時,\(res\) 儲存的就是我們想要的答案。
實數的二分
對於實數的二分不能進行 \(l = mid + 1;\) 或者 \(r = mid - 1;\) 這樣的操作,並且也不能使用 \(l \le r\) 來作為迴圈地判斷條件。
而是應該使用 \(r - l\) 小於某乙個臨界值,比如如果我們希望答案精確到小數點後 \(3\) 為,那麼我可以在滿足條件 \(r- l \lt 10^\) 的情況下推出迴圈,因為退出迴圈的時候 \(l\) 和 \(r\) 在保留 \(3\) 位小數的情況下是相同的結果。
對於實數的二分,我們二分實現的偽**是:
double l = 左邊界, r = 右邊界; // 注意這裡是實數的表示,l和r最好開成double
while (r - l >= 1e-4)
else
}
最後,退出迴圈的時候肯定能確保 \(l\) 和 \(r\) 的差距已經很小了,然後我們輸出 \(l\) 和 \(r\) 精確到 \(3\) 位小數點的結果就可以了。
注意:在實數的二分下,使用 \(l = mid\) 或者 \(r= mid\) ,而不是在整數二分中的 \(l = mid+1\) 或者 \(r = mid-1\) 。要注意這個細節。
注意:題目中右邊界是100km,也就是100000m,處理時要注意這個細節。
實現**如下:
#include using namespace std;
const int maxn = 100010;
int n, k;
double a[maxn];
bool check(double len)
int main()
printf("%.2lf\n", l);
return 0;
}
POJ 1064 網線主管 二分搜尋
原題傳送門 有 n nn條繩子,它們的長度分別為 l il i li 如果從它們中切割出k kk條長度相同的繩子的話,這些繩子每條最長能有多長?答案保留到小數點後 2位 白書中所謂典型的二分搜尋題,左邊界從0開始,右邊界從所有繩子中最長的開始,每次統計 l r 2 l r 2 l r 2能切割出來多...
NOIP學習之二分查詢 124 網線主管
測試鏈結 總時間限制 1000ms 記憶體限制 65536kb 描述 仙境的居民們決定舉辦一場程式設計區域賽。裁判委員會完全由自願組成,他們承諾要組織一次史上最公正的比賽。他們決定將選手的電腦用星形拓撲結構連線在一起,即將它們全部連到乙個單一的中心伺服器。為了組織這個完全公正的比賽,裁判委員會主席提...
二分練習題1 查詢元素 題解
題目描述 現在告訴你乙個長度為 n 的有序陣列 a 1,a 2,a n 以及 q 次詢問,每次詢問會給你乙個數 x 對於每次詢問,你需要確定在陣列中是否存在某乙個元素 a i x 輸入格式 輸入的第一行包含乙個整數 n 1 le n le 100000 用於表示陣列中元素的個數。輸入的第二行包含 n...