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.
解决一个数学问题:如何从N段已知长度的线中切割出K段等长的最大线段,确保精度达到两位小数。使用了二分查找算法进行求解。
3万+

被折叠的 条评论
为什么被折叠?



