3592: 网线切割 T3

Memory Limit:128 MB Time Limit:1.000 S
Judge Style:Text Compare Creator:
Submit:214 Solved:84

Description

T3.网线切割

(cable.pas/c/cpp)

[题目描述] Wonderland居民决定举行一届地区性程序设计大赛。仲裁委员会志愿负责这次赛事并且保证会组织一次有史以来最公正的比赛。为此,所有参赛者的电脑和网络中心会以星状网络连接,也就是说,对每个参赛者,组委会会用一根长度一定的网线将他的计算机与中心连接,使得他们到网络中心的距离相等。

       为了买网线,组委会与当地的网络公司联系,要向他们购买一定数目的等长网线,这些网线要尽可能的长,使得组织者可以让选手们彼此远离。

       于是公司指派管理网线事务的负责人解决此事。负责人清楚地知道仓库里每根网线的长度(精确到厘米:cm),他也可以将他们以厘米的精度切割——前提是他得知道切成多长。但是现在,这个长度他算不出来,于是他彻底迷茫了。

       你要做的,就是帮助困惑的负责人。编一个程序求出为了得到一定数目的等长网线,每根网线最大的可能长度。

 [数据输入]

输入文件的第一行由两个整数NK组成,由一个空格间隔。N(1N10000)是仓库里光缆的数目,K(1K10000)是需要的网线数目。

  接下来的N行每行只有一个实数,告诉你每根缆线的长度(单位:m)。这些网线至少长1m,最多不超过100km所有的长度精确到cm,且小数点后有且仅有两位

[数据输出]

把你求得的最大网线长度写进输出文件(单位:m)。长度要精确到cm,并且输出时小数点后要恰有两位。

   如果无论如何也不可能切割出需要数目的网线(每根至少1cm长),那么就输出“0.00”(不包括引号)。

[样例输入]

4 11

8.02

7.43

4.57

5.39

 

[样例输出]

2.00

Sample Input Copy

4 11
8.02
7.43
4.57
5.39

Sample Output Copy

2.00

HINT

1.二分答案+判断;
2.注意到将输入数据先转换为cm为单位,省去很多浮点数操作。


参考程序
program cable;
var p,i,beg,ed,k,n:longint;
    a:array[1..10000] of longint;
    q:real;
function work(x:longint):longint;
var i:longint;
begin
work:=0;
for i:=1 to n do
 inc(work,a[i] div x);
end;

begin
assign(input,'cable.in');reset(input);
assign(output,'cable.out');rewrite(output);
readln(n,k);
for i:=1 to n do
begin
 readln(q);
 a[i]:=round(q*100);
end;
beg:=0;ed:=10000000;
while beg<ed do
 begin
  p:=(beg+ed) div 2;
  if work(p)<k then ed:=p
  else beg:=p;
 if beg+1=ed then break;
 end;
p:=beg mod 100;
writeln(beg div 100,'.',p div 10,p mod 10);
close(input);close(output);
end.