4.截取
(a.pas/c++)
【题目描述】
给你N段线的长度,现在要你从他们上面切下K段来(切下的不能合并),使得这K段长度相等,并且最大。如若求出的答案小于0.01,则认为无解,输出0.00。(所有非整数都精确到了两位,输出亦然)1<=N,K<=10000
【样例输入】
4 11
8.02(在1到100000之间的实数)
7.43
4.57
5.39
【输出样例】
2.00
var a:array[1..10000]of int64;//好大啊 n,k,sum,max,min,ans:int64; i:longint;//循环不能太大 m:real;//输出是小数 function check(x:longint):int64;//找目前每段的最大值 var y:int64; begin y:=0; for i:=1 to n do y:=y+a[i] div x; check:=y; end; procedure try(l,r:int64);//二分的递推 var mid,t:int64; begin if l>r then exit; mid:=(l+r) div 2; t:=check(mid); if t<k then try(l,mid-1) else begin if (t<min) or ((t=min) and (ans<mid)) then begin min:=t; ans:=mid; end; try(mid+1,r); end; end; begin assign(input,'a.in');reset(input); assign(output,'a.out');rewrite(output); readln(n,k); for i:=1 to n do begin readln(m); a[i]:=round(m*100);//搞成整数 inc(sum,a[i]);//算总长 end; max:=sum div k;//切下来最长的长度=总长/段数 min:=maxlongint; try(1,max); if min=maxlongint then writeln('0.00') else writeln(ans/100:0:2); close(input); close(output); end.