openjudge1.11編程基礎之二分查找 04:網線主管

04:網線主管

總時間限制: 1000ms 內存限制: 65536kB

描述

仙境的居民們決定舉辦一場程序設計區域賽。裁判委員會完全由自願組成,他們承諾要組織一次史上最公正的比賽。他們決定將選手的電腦用星形拓撲結構連接在一起,即將它們全部連到一個單一的中心服務器。爲了組織這個完全公正的比賽,裁判委員會主席提出要將所有選手的電腦等距離地圍繞在服務器周圍放置。

爲購買網線,裁判委員會聯繫了當地的一個網絡解決方案提供商,要求能夠提供一定數量的等長網線。裁判委員會希望網線越長越好,這樣選手們之間的距離可以儘可能遠一些。

該公司的網線主管承接了這個任務。他知道庫存中每條網線的長度(精確到釐米),並且只要告訴他所需的網線長度(精確到釐米),他都能夠完成對網線的切割工作。但是,這次,所需的網線長度並不知道,這讓網線主管不知所措。

你需要編寫一個程序,幫助網線主管確定一個最長的網線長度,並且按此長度對庫存中的網線進行切割,能夠得到指定數量的網線。

輸入

第一行包含兩個整數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


var
  n,m,i,s:longint;
  l,r,mid:longint;
  len:array[0..20000] of longint;
  d:extended;
begin
  read(n,m);
  l:=maxlongint;
  for i:=1 to n do
    begin
      read(d);
      len[i]:=round(d*100);
      if len[i]<l
      then l:=len[i];
      if len[i]>r
      then r:=len[i];
    end;
  l:=1;//這裏將小數乘100,即單位由米變爲釐米,就可以用整數做,最短1cm
  r:=r+1;
  while l<r do
    begin
      mid:=(l+r+1) div 2;//注意一定要加1,如果出現l=200,r=201這樣的情況不加1就會卡掉
      s:=0;
      for i:=1 to n do
        s:=s+len[i] div mid;
      if s>=m
      then l:=mid//如果切出的數比大於等於m,則說明mid是可行答案,mid到r之間也有可行答案,所以要包含mid
      else r:=mid-1;//如果切出的數比m小則說明mid不是可行答案,所以不能包括mid
    end;
    s:=0;
 for i:=1 to n do
   s:=s+len[i] div l;
 if s<m//最後判斷能不能至少切出1cm
 then writeln('0.00')
 else writeln(l/100:0:2);
end.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章