description
仙境的居民們決定舉辦一場程式設計區域賽。裁判委員會完全由自願組成,他們承諾要組織一次史上最公正的比賽。他們決定將選手的電腦用星形拓撲結構連線在一起,即將它們全部連到乙個單一的中心伺服器。為了組織這個完全公正的比賽,裁判委員會主席提出要將所有選手的電腦等距離地圍繞在伺服器周圍放置。
為購買網線,裁判委員會聯絡了當地的乙個網路解決方案提供商,要求能夠提供一定數量的等長網線。裁判委員會希望網線越長越好,這樣選手們之間的距離可以盡可能遠一些。
該公司的網線主管承接了這個任務。他知道庫存中每條網線的長度(精確到厘公尺),並且只要告訴他所需的網線長度(精確到厘公尺),他都能夠完成對網線的切割工作。但是,這次,所需的網線長度並不知道,這讓網線主管不知所措。
你需要編寫乙個程式,幫助網線主管確定乙個最長的網線長度,並且按此長度對庫存中的網線進行切割,能夠得到指定數量的網線。
input
第一行包含兩個整數n和k,以單個空格隔開。n是庫存中的網線數,k是需要的網線數量。
接下來n行,每行乙個數,為庫存中每條網線的長度(單位:公尺)。所有網線的長度至少1m,至多100km。輸入中的所有長度都精確到厘公尺,即保留到小數點後兩位。
output
網線主管能夠從庫存的網線中切出指定數量的網線的最長長度(單位:公尺)。必須精確到厘公尺,即保留到小數點後兩位。
若無法得到長度至少為1cm的指定數量的網線,則必須輸出"0.00"(不包含引號)。
sample input 1
4 11
8.02
7.43
4.57
5.39
sample output 1
2.00
hint
1≤n≤10000,1≤k≤10000
time limit
1000ms
memory limit
256mb
分析:題目核心意思是要在網線數量夠的前提下確定網線的最大長度。當確定乙個長度,分割得的網線數不小於要求數,就說明按這個長度分割是夠用的,可以嘗試更大的長度,如果該長度分割得的網線數比要求數少,就說明分割得太長了,得把長度減小。分析到這裡,就明白這是個妥妥的二分答案題,需要把網線分割長度二分再搜尋。
不過這道題目的特別之處在於網線長度資料都是浮點數,精確到小數點後兩位,為了使資料處理起來方便,可以把網線長度乘以100(化為整數)再處理。
另外,題目要求當網線長度連1cm都滿足不了時輸出「0.00」,可以令記錄答案的變數初值ans為0,這樣在二分過程中,如果連1cm都滿足不了,那直到退出迴圈ans也不會被再次賦值,仍是0。出二分迴圈後特判一下就好了。本人根據提交情況認為此處有坑,雖然可以不特判,printf("%.2f",ans/100.0)也可以做到輸出浮點數0.00,但是題目意思應該是要輸出乙個字串,所以我沒加特判的時候是pa,加了以後才ac。
#include
#include
int n, k;
//庫存網線數,需要網線數
int a[
10000]=
;//儲存庫存網線資料
int ans=0,
*max;
//記錄答案,庫存網線最大長度
double temp;
//接收庫存網線資料的工具
intcnt
(int l)
//計算庫存網線可以分得長度為l的網線多少根
return sum;
}int
main()
//找最大值,需注意,該函式返回的是一迭代器
max = std::
max_element
(a, a + n)
;//左開右開寫法,區間為(0,*max+1)
int left =
0, right =
*max +
1,mid,sum;
while
(left +
1!= right)
else
if(sum < k)
}//雖然連1cm都滿足不了時ans=0,0/100.0在「%.2f」控制下可輸出0.00
if(ans <1)
else
printf
("%.2f"
, ans /
100.0);
return0;
}
二分(二分答案 二分搜尋)與單調性
經典二分搜尋是二分空間範圍。二分答案又叫二分猜值,是二分解的值空間。其實可以統一,普通的二分搜尋也是二分答案值域 下標空間,也是猜值。二分必須滿足單調性,最直觀的,二分搜尋只能在有序陣列上進行。單調性體現在,下標和元素值是單調的,也就是 if j i 有 a j a i 一般二分答案解決的問題是最優...
POJ 1064 網線主管 二分搜尋
原題傳送門 有 n nn條繩子,它們的長度分別為 l il i li 如果從它們中切割出k kk條長度相同的繩子的話,這些繩子每條最長能有多長?答案保留到小數點後 2位 白書中所謂典型的二分搜尋題,左邊界從0開始,右邊界從所有繩子中最長的開始,每次統計 l r 2 l r 2 l r 2能切割出來多...
二分查詢與二分答案
主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...